【问题标题】:Strange assignment in numpy arraysnumpy数组中的奇怪赋值
【发布时间】:2014-11-04 16:34:52
【问题描述】:

我有一个 numpy 数组 A,其中 n 行大小为 3。每行由三个整数组成,每个整数都是一个整数,它指的是 numpy 数组中的另一个位置。例如,如果我想要N[4] 引用的行,我使用N[N[4]]。视觉上:

N = np.array([[2, 3, 6], [12, 6, 9], [3, 10, 7], [8, 5, 6], [3, 1, 0] ... ])
N[4] = [3, 1 ,0]
N[N[4]] = [[8, 5, 6]
           [12, 6, 9]
           [2, 3, 6]]

我正在构建一个修改 N 的函数,并且我需要为某些指定的 x 修改 N[N[x]],这也是一个参数(示例中为 4)。我想将子数组中的所有 6 更改为另一个数字(比如说 0),所以我使用 numpy.where 来查找索引,它们是

where_is_6 = np.where(N[N[4]] == 6)

现在,如果我像N[N[4]][where_is_6] = 0 一样直接替换,则没有任何变化。如果我之前引用了var = N[N[4]],然后var[where_is_6],则更改已完成,但在函数本地进行,并且 N 不会全局更改。在这种情况下我能做什么?还是我做错了什么?

【问题讨论】:

  • 使用另一个索引的索引不适用于您定义列表N 的方式。您需要先将 N 转换为 numpy.array()
  • 我说它是一个numpy数组,代码虽然没有反映,现在编辑...

标签: python arrays numpy indexing


【解决方案1】:

听起来您只需将索引转换为原始N 的坐标:

row_idxs = N[4]
r,c = np.where(N[row_idxs] == 6)
N[row_idxs[r],c] = 0

【讨论】:

  • 是的!谢谢!下次我需要修改的时候我会这样想。
【解决方案2】:

问题在于N[N[4]] 是一个新数组,您可以检查一下:

print(N[N[4]].flags)

C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False

OWNDATA 表明了这一事实。

【讨论】:

  • 感谢 .flags 提示!那我该怎么做才能做出改变呢?
  • @AlejandroSazo 好吧... perimosocordiae 的回答似乎是一个很好的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多