我想将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
答案 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