【问题标题】:How to write in or replace new values in a conditional array?如何在条件数组中写入或替换新值?
【发布时间】:2018-02-28 01:32:00
【问题描述】:

我构造一个数组,

a=np.tile(np.arange(5),4)

a
>>>array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])

我设置了一些条件,

mask=a!=0
a[mask]
>>>array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])

现在我想用偶数替换奇数索引元素,我试试

a[mask][1::2]=a[mask][::2]
a
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4])

但它没有任何改变。

【问题讨论】:

    标签: python arrays numpy boolean mask


    【解决方案1】:

    Boolean index 返回数据的副本而不是视图。 与索引数组一样,返回的是数据的副本,而不是切片时的视图。 因为a[mask] 是副本a[mask][1::2] 不会更改原始数组。

    您可以使用np.flatnonzero 保留原始的非零索引,而不是使用布尔掩码,将索引设置为奇数和偶数位置的子集,然后使用索引进行分配:

    a=np.tile(np.arange(5),4)
    idx = np.flatnonzero(a != 0)
    a[idx[1::2]] = a[idx[::2]]
    a
    # array([0, 1, 1, 3, 3, 0, 1, 1, 3, 3, 0, 1, 1, 3, 3, 0, 1, 1, 3, 3])
    

    【讨论】:

    • thx,不过我正好用!=0作为例子,如果条件不一样,比如a>0或者a!=1等,那么np.flatnonzero的使用方式是不是通用的。
    • 它应该仍然以相同的方式工作。 np.flatnonzero 正在检查布尔数组条件的结果。所以不管条件是什么。
    • thx,我发现np.flatnonzero 使多维数组变平,这不是我想要的。我该如何解决这个问题或任何其他方式来处理这个问题?
    • 你能举一个多维数组的例子以及你想如何转换它吗?
    • 我的矩阵是 4d 1000*1000*1000*1000,如果我把整个矩阵展平就会变得混乱,你同意吗?
    猜你喜欢
    • 2012-12-13
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2017-12-04
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多