【问题标题】:Numpy Conditionally Replace Column ElementsNumpy 有条件地替换列元素
【发布时间】:2019-01-17 10:21:43
【问题描述】:

所以我已经看过this question

我知道您可以有条件地替换单个列,但是多个列呢?当我尝试它时,它似乎不起作用。

the_data = np.array([[0, 1, 1, 1],
                     [0, 1, 3, 1],
                     [3, 4, 1, 3],
                     [0, 1, 2, 0],
                     [2, 1, 0, 0]])

the_data[:,0][the_data[:,0] == 0] = -1 # this works

columns_to_replace = [0, 1, 3]
the_data[:,columns_to_replace][the_data[:,columns_to_replace] == 0] = -1 # this does not work

我最初认为第二种情况不起作用,因为我认为the_data[:,columns_to_replace] 创建一个副本而不是直接引用元素。但是,如果是这种情况,那么当您只替换单个列时​​,第一种情况也不应该起作用。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您确实得到了一份副本,因为您使用的是高级索引

    在选择对象,obj是一个非元组序列对象 em>,ndArray(数据类型整数或bool)或带有至少一个序列对象的元组或具有至少一个序列对象的元组时触发高级索引ndarray(数据类型为整数或布尔值)。高级索引有两种类型:整数和布尔值。

    高级索引始终返回数据的副本(与返回视图的基本切片相反)。

    (取自the docs

    第一部分有效,因为它使用基本切片。


    我认为你可以在不复制的情况下做到这一点,但仍然需要一些内存开销:

    columns_to_replace = [0, 1, 3]
    
    mask = np.zeros(the_data.shape, bool) # don't use too much memory
    mask[:, columns_to_replace] = 1
    
    np.place(the_data, (the_data == 0) * mask, [-1]) # this doesn't copy anything
    

    【讨论】:

    • 是否有不调用副本的解决方法?还是循环是唯一的选择?
    • @user3426943,看起来有一种解决方法。请查看我的编辑。
    • @user3483203,它仍然分配内存,只是没有初始化它(无论如何你都必须用一和零填充它)。
    • the_data[(the_data==0)*mask]=-1 也应该可以工作。关键是要找到结合列标准和 0 测试的 mask,就像使用布尔值 * 一样。
    • @hpaulj,它确实有效,而且看起来也更简单。我正在寻找一个非常清楚说:“我不是在创建副本而不是视图”的解决方案,所以我的解决方案对此有点过于冗长了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2017-08-02
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多