Numpy有条件地替换列元素

时间:2018-08-09 21:01:21

标签: python numpy

所以我已经看过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]创建一个副本而不是直接引用元素。但是,如果是这种情况,那么当您只替换单个列时​​,第一种情况也不起作用。

1 个答案:

答案 0 :(得分:2)

您确实得到了副本,因为您正在使用高级索引

  当选择对象obj是一个非元组序列对象,一个ndarray(数据类型为整数或布尔值)或具有至少一个序列对象的元组时,会触发

高级索引编制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