import numpy as np
a = np.array([0, 10, 11, 1])
# OUT:
# array([ 0, 10, 11, 1])
b = np.arange(81).reshape(9, 9)
# OUT:
# array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
# [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
# [18, 19, 20, 21, 22, 23, 24, 25, 26],
# [27, 28, 29, 30, 31, 32, 33, 34, 35],
# [36, 37, 38, 39, 40, 41, 42, 43, 44],
# [45, 46, 47, 48, 49, 50, 51, 52, 53],
# [54, 55, 56, 57, 58, 59, 60, 61, 62],
# [63, 64, 65, 66, 67, 68, 69, 70, 71],
# [72, 73, 74, 75, 76, 77, 78, 79, 80]])
我希望b数组的每一项都添加到a数组中,并得到类似的结果,就像一个简单的循环可以做到的那样:
result = list()
for row in b:
ls = list()
for i in row:
c = a + i
ls.append(c)
result.append(ls)
np.array(result)
循环效率不够高,有没有办法使用Numpy广播规则来得到这个结果?(Numpy数组)
发布于 2020-08-07 10:52:54
一种“通用”的方法是使用None
进行索引。如果使用None
为数组编制索引,则会创建一个新轴并沿该轴广播该数组。
所以如果你有a.shape = (4,)
和b.shape = (9,9)
,你可以像这样添加:
a[:,None,None] + b[None,:,:]
a
索引中的:
是a
的唯一轴,大小为4。其余两个轴None,None
是广播以匹配b
的新轴。
b
索引中的:,:
索引是数组中的轴,形状为(9,9)
。None
是一个新的axis,广播以匹配a
。
可能有一种更短的方法来编写它,但我不想费心记住隐式广播的规则是如何工作的,所以我只是将其显式地写出来。
如果更清楚,您也可以使用numpy.newaxis
,但它具有相同的效果。
https://stackoverflow.com/questions/63294463
复制相似问题