对于一个N维的numpy数组中的每个元素,将其加入到一个1维的numpy数组中,并返回一个N+1维的数组。

3

我试图按顺序将numpy数组的每个元素添加到另一个numpy 1D数组中,但不作为逐元素操作。

更具体地,定义func

import numpy as np

array1 = np.array([1,2,3,4])
array2 = np.array([10,20,30])

def func(array1,array2):
  #what goes here?
  return output_array

output_array = func(array1,array2)

因此,以下代码将输出一个包含三个数组的多维数组:

output_array = np.array([[11,12,13,14],[21,22,23,24],[31,32,33,34]])

我使用以下代码使其成功运行:

def func(array1,array2):
  return np.array(list(map(lambda x: x + array1,array2)))

然而,似乎应该有一种更好的方法来实现这个功能,并且将其推广到n维也是非常有用的。我尝试过使用np.vectorize()

def func(array1,array2):
  np_function = np.vectorize(lambda x: x + array1)
  return np_function(array2)

但是这种方法行不通,因为它试图将迭代器中的序列分配给单个数组元素(错误信息“使用序列设置数组元素”)。

3个回答

4
你不需要任何特殊函数,这是numpy broadcasting 功能的一个典型应用案例。你所需要的只有:
output_array = array1[None, :] + array2[:, None]  # or even array1 + array2[:, None]

为了理解它,看一下以下内容之间的区别。
print(array1.shape)          # (4,)
print(array1[:, None].shape) # (4, 1)
print(array1[None, :].shape) # (1, 4)

当您使用(1, 4)广播(4, 1)时,您会得到(4, 4)

2
nD解决方案:def outer_add(*arrays): return reduce(np.add.outer, arrays) - Daniel F
1
@DanielF np.add.outer 也可以很好地处理 n 维数组,不是吗?如果在投票时存在疑虑,你总是可以通过标记来引起投票者的注意。 - Divakar
@Divakar 我认为 @toomuchrock 想要多个1d输入 -> nd输出。但是,np.add.outer也适用于nd输入。 - Daniel F
@DanielF 我看到了多个/ n-维度的提及,而不是多个1D数组。希望我没有错过什么地方。如果我错过了,请告诉我。 - Divakar
@Divakar 我认为最后一个 func 是尝试创建一个递归函数。但很难确定。 - Daniel F
显示剩余2条评论

1
另一种方法:np.add(array2.reshape(3,1), array1)

但我喜欢丹的答案的简洁性。 - mermaldad

1

只需将您的第一个数组重塑为2d,然后将其添加到第二个数组中即可。

array3 = np.reshape(array2,(-1, 1))+ array1

输出:
[[11 12 13 14]
 [21 22 23 24]
 [31 32 33 34]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接