numpy广播到各个方面

时间:2018-02-25 13:09:51

标签: python numpy

我有一个像这样的3d numpy数组:

O_DIRECT

我想从给定坐标的某个点开始广播所有维度的值,但维度的数量可能会有所不同。

例如,如果给出坐标a = np.ones((3,3,3)) ,我可以执行以下3个功能:

(1,1,1)

结果将是我想要的输出:

a[1,1,:] = 0
a[1,:,1] = 0
a[:,1,1] = 0

或者如果给我坐标array([[[1., 1., 1.], [1., 0., 1.], [1., 1., 1.]], [[1., 0., 1.], [0., 0., 0.], [1., 0., 1.]], [[1., 1., 1.], [1., 0., 1.], [1., 1., 1.]]]) ,相应的广播将是:

(0,1,0)

有没有办法在一个动作而不是3个动作中执行此操作?我问,因为我正在使用的实际数组有更多的维度,这使得代码看起来冗长冗余。此外,如果维度的数量发生变化,我将不得不重写代码。

编辑:它不必是单个动作,我只需要以编程方式在所有维度中执行此操作,这样如果维度的数量发生变化,代码将保持不变。

编辑2:关于这个的逻辑,我不确定这是否相关,但我在地图上给出了一个点(通过坐标)的值,并基于此我知道整个的值同一个地图上的行,列和高度(这就是为什么我用a[0,1,:] = 0 a[0,:,0] = 0 a[:,1,0] = 0 更新全部3作为示例)。在其他情况下,地图是二维的,我仍然知道关于行和列的相同的​​事情,但无法找出适用于不同维度的函数。

2 个答案:

答案 0 :(得分:2)

您可以使用slice函数以slice函数进行实例化,以编程方式完成您要执行的操作 - 例如,请参阅" Dealing with variable numbers of indices within programs"

def broadcast_val(mat, val, indices):
    shape = mat.shape
    for i in len(indices):
        len_axis = shape[i]
        i_axis = slice(len_axis)
        index_tuple = *indices[:i], i_axis, *indices[i+1:]
        mat[index_tuple] = val

我想知道是否有可能使用单一作业做你想做的事......

答案 1 :(得分:1)

这是一种生成您当前正在使用的3行代码字符串的方法,然后执行它们:

import numpy as np

a = np.ones([3,3,3])
coord = [1, 1, 1]

for i in range(len(coord)):
   temp = coord[:]
   temp[i] = ':'
   slice_str = ','.join(map(str, temp))
   exec("a[%s] = 0"%slice_str)

print a

这可能不是最好的方法,但至少它很有趣。现在我们知道它有效,我们可以出去找到合适的语法来实现它而不实际生成字符串并exec它。例如,您可以使用slice

import numpy as np

a = np.ones([3,3,3])
coord = [1, 1, 1]

for i, length in enumerate(a.shape):
   temp = coord[:]
   temp[i] = slice(length)
   a[temp] = 0
print a