NumPy ix_() 函數(shù)

2021-09-03 17:40 更新

ix_函數(shù)可用于組合不同的向量以獲得每個(gè) n-uplet 的結(jié)果。例如,如果要計(jì)算從向量 a、b 和 c 中的每一個(gè)中提取的所有三元組的所有 a+b*c:

  1. >>> a = np.array([2, 3, 4, 5])
  2. >>> b = np.array([8, 5, 4])
  3. >>> c = np.array([5, 4, 6, 8, 3])
  4. >>> ax, bx, cx = np.ix_(a, b, c)
  5. >>> ax
  6. array([[[2]],
  7. [[3]],
  8. [[4]],
  9. [[5]]])
  10. >>> bx
  11. array([[[8],
  12. [5],
  13. [4]]])
  14. >>> cx
  15. array([[[5, 4, 6, 8, 3]]])
  16. >>> ax.shape, bx.shape, cx.shape
  17. ((4, 1, 1), (1, 3, 1), (1, 1, 5))
  18. >>> result = ax + bx * cx
  19. >>> result
  20. array([[[42, 34, 50, 66, 26],
  21. [27, 22, 32, 42, 17],
  22. [22, 18, 26, 34, 14]],
  23. [[43, 35, 51, 67, 27],
  24. [28, 23, 33, 43, 18],
  25. [23, 19, 27, 35, 15]],
  26. [[44, 36, 52, 68, 28],
  27. [29, 24, 34, 44, 19],
  28. [24, 20, 28, 36, 16]],
  29. [[45, 37, 53, 69, 29],
  30. [30, 25, 35, 45, 20],
  31. [25, 21, 29, 37, 17]]])
  32. >>> result[3, 2, 4]
  33. 17
  34. >>> a[3] + b[2] * c[4]
  35. 17

還可以按如下方式實(shí)現(xiàn) reduce:

  1. >>> def ufunc_reduce(ufct, *vectors):
  2. ... vs = np.ix_(*vectors)
  3. ... r = ufct.identity
  4. ... for v in vs:
  5. ... r = ufct(r, v)
  6. ... return r

然后將其用作:

  1. >>> ufunc_reduce(np.add, a, b, c)
  2. array([[[15, 14, 16, 18, 13],
  3. [12, 11, 13, 15, 10],
  4. [11, 10, 12, 14, 9]],
  5. [[16, 15, 17, 19, 14],
  6. [13, 12, 14, 16, 11],
  7. [12, 11, 13, 15, 10]],
  8. [[17, 16, 18, 20, 15],
  9. [14, 13, 15, 17, 12],
  10. [13, 12, 14, 16, 11]],
  11. [[18, 17, 19, 21, 16],
  12. [15, 14, 16, 18, 13],
  13. [14, 13, 15, 17, 12]]])

與普通 ufunc.reduce 相比,此版本的 reduce 的優(yōu)勢在于它利用廣播規(guī)則來避免創(chuàng)建輸出大小乘以向量數(shù)量的參數(shù)數(shù)組。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)