【问题标题】:Cannot assign values to a 'double slice' using numpy无法使用 numpy 将值分配给“双切片”
【发布时间】:2016-04-18 06:38:47
【问题描述】:

我将如何在 numpy 中执行以下操作?

  1. 选择一个数组中包含超过 50% 0 个值的注释的所有行。
  2. 从所有满足 1 的行中选择第一个 n(假设是 2)行。
  3. 做某事并将修改后的行放在形状相同为 1 的零数组的相同索引上。

以下结果是一个没有分配新值的数组:

In [177]:    
a = np.array([[0,0,3],[4,5,6],[7,0,0],[10,11,12],[13,14,15]])
b = np.zeros_like(a)
a
Out[177]:    
array([[ 0,  0,  3],
       [ 4,  5,  6],
       [ 7,  0,  0],
       [10, 11, 12],
       [13, 14, 15]])

In [178]:
# select all rows containg note more than 50% 0 values
percent = np.sum(a == 0, axis=-1) / float(check.shape[1])
percent = percent >= 0.5
slice = np.invert(percent).nonzero()[0]

In [183]:
# select first two rows satisfying 'slice'
a[slice][0:2] 

Out[183]:    
array([[ 4,  5,  6],
       [10, 11, 12]])

In [182]:
# do something and place modified rows on same index of zero array
b[slice][0:2] = a[slice][0:2] * 2

In [184]:
b
Out[184]:    
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

【问题讨论】:

  • 您是不是要执行b[slice][0:2] = a[slice][0:2] * 2(请注意,RHS 我们现在索引的是a 而不是b)。
  • 无论如何,最好先定义slice = np.invert(percent).nonzero()[0][:2],然后使用b[slice] = a[slice] * 2
  • @ajcr 打错了,RHS 确实应该索引 'a'

标签: python arrays numpy slice


【解决方案1】:

问题在于b[slice] 创建的是副本而不是视图(它会触发精美的索引)。代码b[slice][0:2] 创建了这个副本的视图(不是原始的b!)。所以……

b[slice][0:2] = a[slice][0:2] * 2

...正在将a 的相应行分配给b 副本的视图。

因为可能会导致这些情况,所以最好不要以这种方式链接索引操作。相反,只需先计算 slice 的相关行号,然后进行分配:

slice = np.invert(percent).nonzero()[0][:2] # first two rows
b[slice] = a[slice] * 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2017-03-06
    • 2018-07-30
    • 2012-09-15
    • 2015-05-28
    • 2020-07-03
    相关资源
    最近更新 更多