分配给2D NumPy数组的切片

时间:2018-02-20 00:22:00

标签: python arrays numpy indexing slice

我想将0分配给2d数组的不同长度切片。

示例:

import numpy as np    

arr = np.array([[1,2,3,4],
                [1,2,3,4],
                [1,2,3,4],
                [1,2,3,4]])

idxs = np.array([0,1,2,0])

鉴于上述数组arr和索引idxs,您如何分配不同的长度切片。结果如下:

arr = np.array([[0,2,3,4],
                [0,0,3,4],
                [0,0,0,4],
                [0,2,3,4]])

这些不起作用

slices = np.array([np.arange(i) for i in idxs])
arr[slices] = 0
arr[:, :idxs] = 0

4 个答案:

答案 0 :(得分:4)

您可以使用广播比较生成掩码,并相应地索引到arr[np.arange(arr.shape[1]) <= idxs[:, None]] = 0

print(arr) 
array([[0, 2, 3, 4],
       [0, 0, 3, 4],
       [0, 0, 0, 4],
       [0, 2, 3, 4]])

{{1}}

答案 1 :(得分:1)

这就是诀窍:

import numpy as np    

arr = np.array([[1,2,3,4],
               [1,2,3,4],
               [1,2,3,4],
               [1,2,3,4]])
idxs = [0,1,2,0]
for i,j in zip(range(arr.shape[0]),idxs):
  arr[i,:j+1]=0

答案 2 :(得分:1)

这是一个稀疏解决方案,在只有一小部分地方应该归零的情况下可能很有用:

>>> idx = idxs+1
>>> I = idx.cumsum()
>>> cidx = np.ones((I[-1],), int)
>>> cidx[0] = 0
>>> cidx[I[:-1]]-=idx[:-1]
>>> cidx=np.cumsum(cidx)
>>> ridx = np.repeat(np.arange(idx.size), idx)
>>> arr[ridx, cidx]=0
>>> arr
array([[0, 2, 3, 4],
       [0, 0, 3, 4],
       [0, 0, 0, 4],
       [0, 2, 3, 4]])

说明:我们需要构造我们想要放置零的位置的坐标。

行索引很简单:我们只需要从0到3重复每个数字以填充相应的切片。

列索引从零开始,大部分时间都以1递增。因此,为了构造它们,我们在大多数时候使用cumsum。只有在每个新行的开头,我们才能重置。我们通过减去相应切片的长度来做到这一点,例如取消我们在该行中求和的切片。

答案 3 :(得分:1)

import numpy as np

arr = np.array([[1, 2, 3, 4],
                [1, 2, 3, 4],
                [1, 2, 3, 4],
                [1, 2, 3, 4]])

idxs = np.array([0, 1, 2, 0])

for i, idx in enumerate(idxs):
    arr[i,:idx+1] = 0