我有一个像这样的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作为示例)。在其他情况下,地图是二维的,我仍然知道关于行和列的相同的事情,但无法找出适用于不同维度的函数。
答案 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