【问题标题】:Apply a function to every element in 2D NumPy Array对二维 NumPy 数组中的每个元素应用一个函数
【发布时间】:2022-11-28 10:11:53
【问题描述】:

我想对 2D numpy 数组中的每个元素应用一个函数。以下是我的代码。

def fun(arr1, arr2):
  print(arr1)
  print(arr2)
  sum = 0
  for i in range(len(arr1)):
    sum += arr1[i] * arr2[i]
  
  return sum

vfun = np.vectorize(fun)

a1 = np.array([[1, 4, 2], [5, 6, 3], [4, 0, 1]])
a2 = np.array([[1, 5, 5], [2, 5, 3]])

for each in a2:
  result = vfun(each, a1)
  print(result)

我的预期输出:

[31, 50, 9]
[28, 49, 11]

但是我收到以下错误

1
1
TypeError: object of type 'numpy.int64' has no len()

在第一次迭代中,这里调用的不是 fun(a2[0], a1[0]),而是 fun(a2[0][0], a1[0][0])。为什么它会这样?有什么解决办法吗?不允许更改函数“fun(arr1, arr2)”。即,我必须传递两个数组来运行并进行计算。

【问题讨论】:

  • print(arr1) 添加到您的函数以查看 np.vectorize 传递给了什么。我敢打赌它是一个标量,而不是一维数组。在遇到问题后,您确实阅读过,甚至重读过np.vectorize
  • (a2[:,:,None]*a1.T).sum(axis=1)
  • 我在函数中添加了 print(arr1) 和 print(arr2) 并且它给出了更新的输出
  • 它只能使用给定的功能来完成(有趣)。我不允许使用其他方法
  • [fun(a1.T,row) 对于 a2 中的行]

标签: numpy numpy-ndarray


【解决方案1】:

正如@hpaulj 建议的那样,您必须转置 a1 以获得预期的输出。不要vectorize函数;它不会帮助。将@hpaul 最优雅的代码应用于您的情况:

def fun(arr1, arr2):
    sum = 0
    for i in range(len(arr1)):
        sum += arr1[i] * arr2[i]

    return sum

# vfun = np.vectorize(fun)  # <---- do not vectorize

a1 = np.array([[1, 4, 2], [5, 6, 3], [4, 0, 1]])
a2 = np.array([[1, 5, 5], [2, 5, 3]])

for each in a2:
    result = fun(each, a1.T)  # <---- transpose and use fun()
    print(result)

# [31 50  9]
# [28 49 11]

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2021-07-15
    • 2016-08-19
    相关资源
    最近更新 更多