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