我正在尝试使用存储在一组数组(indexPositions
)中的索引来使用矩阵执行简单的数组操作。用示例
u[(indexPositions[:,1]):(indexPositions[:,2]),(indexPositions[:,0])]=0
对象u是一个大矩阵,对于给定的空间区域,我希望将其值设置为零。 indexPositions[:,1]
包含'下界'索引,indexPositions[:,2]
包含'上界'索引。这反映了我想在它们之间设置为零的事实,因此想要在这些索引之间进行迭代。
indexPositions[:,0]
包含上述行范围必须设置为零的列索引。
我不明白为什么不可能这样做(我希望它清楚我想要实现的目标)。我确定它与python有关,不了解它应该执行这些操作的顺序。有没有办法指定这个?矩阵非常庞大,这些操作发生了很多次,所以我真的不想使用慢速python循环。
答案 0 :(得分:0)
为了确保我们谈论同样的事情,我将创建一个简单的例子:
In [77]: u=np.arange(16).reshape(4,4)
In [78]: I=np.array([[0,2,3],[1,4,2]])
In [79]: i=0
In [80]: u[I[i,0]:I[i,1],I[i,2]]
Out[80]: array([3, 7])
In [85]: i=1
In [86]: u[I[i,0]:I[i,1],I[i,2]]
Out[86]: array([ 6, 10, 14])
我正在为I
使用不同的列顺序,但这没关系。
我从第4列中选择2个元素,从第3列中选择3个元素。不同长度的结果表明,我会同时对I
行进行操作时遇到问题。我可能需要在u
的平面视图上操作。
In [93]: [u[slice(x,y),z] for x,y,z in I]
Out[93]: [array([3, 7]), array([ 6, 10, 14])]
如果切片的长度都相同,那么我更有可能在I
行上完成所有操作。
我会更多地考虑这个,但我只是想确保我理解这个问题,以及为什么这个问题可能会很困难。
切片中带有1u[I[:,0]:I[:,1],I[:,2]]
的 :
绝对会成为一个问题。
In [90]: slice(I[:,0],I[:,1])
Out[90]: slice(array([0, 1]), array([2, 4]), None)
抽象地,slice
对象接受数组或列表,但numpy
索引不接受。因此,您必须创建2个或更多简单的切片,而不是一个复杂的切片。
In [91]: [slice(x,y) for x,y in I[:,:2]]
Out[91]: [slice(0, 2, None), slice(1, 4, None)]
我回答了一个类似的问题,一个切片开始的问题来自一个列表,但所有切片都有相同的长度。即第一行0:3
,第二行2:5
,第三行4:7
等。
Access multiple elements of an array How can I select values along an axis of an nD array with an (n-1)D array of indices of that axis?
如果切片的长度都相同,则可以使用广播来构建索引数组。但最终索引仍然是数组,而不是切片。
Fast slicing of numpy array multiple times Numpy Array Slicing 处理从1d数组中获取多个切片,具有不同偏移和长度的切片。我认为,你的问题可以这样投射。认为所有的变更都需要列表理解来构造切片索引。然后可以连接索引,然后进行一次索引操作,或者替代地,多次索引并使结果相继。时间因片数和长度而异。
根据那些早期问题改编的一个构建平面索引列表的例子是:
In [130]: il=[np.arange(v[0],v[1])+v[2]*u.T.shape[1] for v in I]
# [array([12, 13]), array([ 9, 10, 11])]
In [132]: u.T.flat[np.concatenate(il)]
# array([ 3, 7, 6, 10, 14])
与我之前的示例相同,但在1列表中,而不是2。
如果切片数组具有相同的长度,那么我们可以返回一个数组
In [145]: I2
Out[145]:
array([[0, 2, 3],
[1, 3, 2]])
In [146]: il=np.array([np.arange(v[0],v[1]) for v in I2])
In [147]: u[il,I2[:,2]]
Out[147]:
array([[ 3, 6],
[ 7, 10]])
在这种情况下,il = I2[:,[0]]+np.arange(2)
可用于构造第一个索引数组而不是列表理解(这是我之前提到的广播)。