我有一个Numpy数组和一个索引列表,其值我想增加一个.此列表可能包含重复索引,我希望增量与每个索引的重复次数一致.没有重复,命令很简单:
a=np.zeros(6).astype('int')
b=[3,2,5]
a[b]+=1
Run Code Online (Sandbox Code Playgroud)
有了重复,我想出了以下方法.
b=[3,2,5,2] # indices to increment by one each replicate
bbins=np.bincount(b)
b.sort() # sort b because bincount is sorted
incr=bbins[np.nonzero(bbins)] # create increment array
bu=np.unique(b) # sorted, unique indices (len(bu)=len(incr))
a[bu]+=incr
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?假设np.bincount
和np.unique
操作会产生相同的排序顺序是否存在风险?我错过了一些简单的Numpy操作来解决这个问题吗?
我有一个二维数组,并且有一些数字要添加到某些单元格中。我想对操作进行矢量化以节省时间。问题是当我需要将多个数字添加到同一单元格时。在这种情况下,矢量化代码仅添加最后一个。“ a”是我的数组,“ x”和“ y”是我要增加的单元格的坐标,“ z”包含我要添加的数字。
import numpy as np
a=np.zeros((4,4))
x=[1,2,1]
y=[0,1,0]
z=[2,3,1]
a[x,y]+=z
print(a)
Run Code Online (Sandbox Code Playgroud)
如您所见,a [1,0]应该增加两次:一个乘以2,一个乘以1。因此,期望的数组应该是:
[[0. 0. 0. 0.]
[3. 0. 0. 0.]
[0. 3. 0. 0.]
[0. 0. 0. 0.]]
Run Code Online (Sandbox Code Playgroud)
但是我得到了:
[[0. 0. 0. 0.]
[1. 0. 0. 0.]
[0. 3. 0. 0.]
[0. 0. 0. 0.]]
Run Code Online (Sandbox Code Playgroud)
使用for循环可以轻松解决该问题,但是我想知道是否可以正确向量化此操作。
我正在尝试将二阶张量转换为二元三阶张量。给定一个二阶张量作为 amxn numpy 数组:A,我需要取每个元素值:x,在 A 中并将其替换为向量:v,维度等于 A 的最大值,但值 1 递增在 v 对应于值 x 的索引处(即 v[x] = 1)。我一直在关注这个问题:Increment given indices in a matrix,它解决了在由二维坐标给出的索引处产生增量的数组。我一直在阅读答案并尝试使用 np.ravel_multi_index() 和 np.bincount() 来做同样的事情,但使用 3 维坐标,但是我不断收到 ValueError: "invalid entry in坐标数组"。这是我一直在使用的:
def expand_to_tensor_3(array):
(x, y) = array.shape
(a, b) = np.indices((x, y))
a = a.reshape(x*y)
b = b.reshape(x*y)
tensor_3 = np.bincount(np.ravel_multi_index((a, b, array.reshape(x*y)), (x, y, np.amax(array))))
return tensor_3
Run Code Online (Sandbox Code Playgroud)
如果您知道这里有什么问题或知道实现我的目标的更好方法,那么两者都会非常有帮助,谢谢。