【发布时间】:2018-04-17 17:29:55
【问题描述】:
假设我有一些随机的 numpy 数组:
>>> x = np.random.randn(10, 4, 4)
因此可以将其视为 10 个 4x4 数组。现在,我也有一些关于这些数组的坐标:
>>> coords.shape
(10, 4, 4, 2)
这个数组的特定元素可能如下所示:
>>> coords[i][j][k]
array([ 2, 2])
现在,我想创建一个数组,y,大小为 (10, 4, 4),如果 coords[i][j][k] 在边界内,则 y[i][j][k] = x[coords[i][j][k]],否则 0。
我尝试过如下操作:
>>> y = np.where(np.logical_and(
np.all(coords >= 0, axis = 3),
np.all(coords <= 3, axis = 3)),
x[tuple(coords)], 0)
但我无法完全正确地获取广播规则,而且我遇到了错误。
例如,假设我们有,
>>> x = np.array([
[[1., 2.],
[4., 5.]],
[[6., 7.],
[8., 9.]]])
与,
>>> coords = np.array([
[[[0,-1], [0, 0]],
[[1, 1], [1, 0]]],
[[[1, 1], [1, 0]],
[[7, 2], [0, 0]]]
])
那么,我想以某种方式得到
y = np.array([
[[0., 1.],
[5., 4.]],
[[9., 8.],
[0., 6.]]])
如何在 Python 中实现这一点?
【问题讨论】:
-
np.where(mask,x,0)不能在mask是all掩码的地方工作?也就是说,您可以在那里列出x而不是x[tuple(coords)]? -
所以这只是给你
x,除了那些坐标超出范围的位置。不是x相对于新坐标的洗牌。 -
你的意思不是 [j][k] 有:
if coords[i][j][j] is in bounds, a吗?另外,我们在谈论什么洗牌? -
已编辑以反映您的上述评论。而
coords可以被认为是元素的“洗牌”,但有些坐标可能会出现两次,或者根本不会出现,所以它可能不是真正的洗牌。 -
那么,
coords[i,j,k,0]正在索引到第二轴,coords[i,j,k,1]索引到x的第三轴?
标签: python arrays numpy indexing array-broadcasting