【问题标题】:Assign values to different index positions in Numpy array将值分配给 Numpy 数组中的不同索引位置
【发布时间】:2017-01-27 18:33:24
【问题描述】:

假设我有一个数组

np.zeros((4,2))

我有一个值列表[4,3,2,1],我想将其分配给以下位置: [(0,0),(1,1),(2,1),(3,0)]

如何在不使用 for 循环或展平数组的情况下做到这一点?

我可以使用精美的索引来检索值,但不能分配它们。

======更新=========

感谢@hpaulj,我意识到我的原始代码中的错误是。

当我使用zeros_like 启动数组时,它默认为int 并截断值。因此,看起来我没有分配任何东西!

【问题讨论】:

  • arr[idx[:,0], idx[:,1]] = [4,3,2,1], 其中idx = np.array([[0,0],[1,1],[2,2],[3,1]])?
  • Position (2,2) 超出了原始数组的范围。
  • 是的,您可以使用精美的索引进行分配。试试a[[0,1,2,3], [0,1,2,1]] = 4,3,2,1
  • @wim 是的,你是对的。我改变了问题。

标签: python arrays numpy


【解决方案1】:

您可以使用元组索引:

>>> import numpy as np
>>> a = np.zeros((4,2))
>>> vals = [4,3,2,1]
>>> pos = [(0,0),(1,1),(2,0),(3,1)]
>>> rows, cols = zip(*pos)
>>> a[rows, cols] = vals
>>> a
array([[ 4.,  0.],
       [ 0.,  3.],
       [ 2.,  0.],
       [ 0.,  1.]])

【讨论】:

  • 是的,它有效。但是,如果我将 a 初始化为 np.zeros_like,它并没有赋值,这真的很奇怪!
  • 编辑跟进:它适用于玩具示例,但不适用于我之前的代码。我不确定错误在哪里。
  • 使用zeros_like时要注意dtypes。将浮点数分配给 int 插槽会截断值。
  • 似乎不适用于 3d。不确定这是一个错误还是我需要调整索引以适应 3d
【解决方案2】:

这是基于@hpaulj 评论的@wim 答案的简化版本。 np.transpose 自动将 Python 元组列表转换为 NumPy 数组并转置它。 tuple 将索引坐标转换为有效的元组,因为 a[rows, cols] 等效于 NumPy 中的 a[(rows, cols)]

import numpy as np
a = np.zeros((4, 2))
vals = range(4)
indices = [(0, 0), (1, 1), (2, 0), (3, 1)]
a[tuple(np.transpose(indices))] = vals
print(a)

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 2019-01-04
    • 2021-02-07
    • 2020-05-05
    • 2018-04-11
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多