【问题标题】:python: broadcast sliced np.array assignment to any number of dimensionspython:将切片的np.array分配广播到任意数量的维度
【发布时间】:2018-06-23 12:39:24
【问题描述】:

我有 np.arrays C、R 和 S 形状分别为 (?, d)、(?, n) 和 (?, d);其中 d

for i in range(?):
    R[i][S[i]]=C[i]

即:我希望对于索引的每个元组 i(在 ? 指定的范围内)取 R 中的相应数组 R[i] 并分配 d 个位置(由 S[i] 指定的位置)为数组 C[i] 中的值。

pythonic 的方法是什么?

例子:

设置

import numpy as np
m,n,d= 2,7,4
R=np.zeros((m,n))
C=np.arange(d*m).reshape((m,d))
S=np.array([[0,2,4,6],[3,4,5,6]])

这行得通:

for i in range(m):
    R[i][S[i]]=C[i]

这不起作用:

R[S]=C

【问题讨论】:

  • 如果您在问题描述中添加了示例输入和输出,您可能会收到更多回复。
  • 不确定但idx = np.ogrid[tuple(map(slice, R.shape))] idx[-1] = S R[idx] = C 做你想做的事吗?
  • 请阅读this section
  • 最近使用来自argsort 的索引数组在 3d 数组的最后一维上的示例:stackoverflow.com/questions/48072007/…
  • @PaulPanzer,您的代码似乎确实可以满足我的要求,但我不明白它是如何工作的?你介意稍微详细说明一下吗?谢谢

标签: python arrays numpy array-broadcasting


【解决方案1】:

您的 2D 示例可以按如下方式完成:

R[np.arange(m)[:, None], S] = C
# array([[ 0.,  0.,  1.,  0.,  2.,  0.,  3.],
#        [ 0.,  0.,  0.,  4.,  5.,  6.,  7.]])

3D 情况类似:

i, j, k = R.shape
i, j, k = np.ogrid[i, j, k]
R[i, j, S] = C

在 ND 中可以这样写:

idx = np.ogrid[tuple(map(slice, R.shape))]
idx[-1] = S
R[idx] = C

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2023-03-23
    相关资源
    最近更新 更多