按维度扩展np.array()

时间:2017-03-03 13:42:22

标签: python arrays numpy

说我有一个原始数组

[:, 2, :, 1]

我正在使用子集w。在这个子集上,我有一个数组告诉我是否应该更新update = array([[False, True], [False, True]])

update[0, 1] == True

基本上,w[0, 2, 1, 1]意味着w应该增加:第一个(0)维度对应w中的0维度,第二个维度对应{{1}中的维度2 }}。尺寸1和3固定为(2, 1)(因为那是我操作的子集)。

现在,我想对w隐含的维度产生update的影响。基本上,我正在寻找index,这样做时

w[index] = 0

我设置为0个元素[0, 2, 1, 1][1, 2, 1, 1]

如果w只是我的2x2数组,我可以通过w[update] = 0执行此操作,但我必须考虑其中的其他维度。我怎么干净利落地做到这一点?

更复杂的设置

现在,我没有处理简单的子集[:, 2, :, 1],而是处理更复杂的事情。

我有一个名为secondDim的数组

secondDim = np.array([2, 3])

它包含第二维作为第一维的函数。也就是说,当第一维度等于0时,我将第二维度切片为2.当第一维度等于1时,我将第二维度切片为3.

现在,我正在寻找index,这样当我设置

w[index] = 0

我设置为0个元素[0, secondDim[0], 1, 1][1, secondDim[1], 1, 1] - 即[0, 2, 1, 1][1, 3, 1, 1]

1 个答案:

答案 0 :(得分:2)

Part - 1

只需w[:,2,:,1][update] = 0即可。

第2部分

一种方法是存储来自mask的行,col索引并使用subscripted-indexing -

r,c = np.where(update)
a[r,secondDim,c,1] = 0

示例运行 -

In [213]: a = np.random.randint(11,99,[2, 4, 2, 3])

In [222]: secondDim
Out[222]: array([2, 3])

In [216]: update   # For first and third dims
Out[216]: 
array([[False,  True],
       [False,  True]], dtype=bool)

In [214]: a[0, 2, 1, 1]
Out[214]: 85

In [215]: a[1, 3, 1, 1]
Out[215]: 47

In [217]: r,c = np.where(update)

In [218]: a[r,secondDim,c,1] # access those elems
Out[218]: array([85, 47])

In [219]: a[r,secondDim,c,1] = 0 # assign 0s

In [220]: a[0, 2, 1, 1] # verify
Out[220]: 0

In [221]: a[1, 3, 1, 1] # verify
Out[221]: 0

我们也可以将此方法用于part-1 -

w[r,2,c,1] = 0