替换numpy数组的特定列中的值

时间:2015-09-02 15:21:23

标签: python arrays numpy replace

我有一个N x M numpy数组(矩阵)。以下是3 x 5数组的示例:

x = numpy.array([[0,1,2,3,4,5],[0,-1,2,3,-4,-5],[0,-1,-2,-3,4,5]])

我想扫描x的所有列,如果它们等于特定值,则替换每列的值。 例如,此代码旨在将所有负值(其中值等于列号)替换为100:

for i in range(1,6):
    x[:,i == -(i)] = 100 

此代码获取此警告:

DeprecationWarning: using a boolean instead of an integer will result in an error in the future

我正在使用numpy 1.8.2。如果没有降级numpy,我怎么能避免这个警告?

4 个答案:

答案 0 :(得分:3)

我不遵循您的代码尝试做的事情:

i == -(i)

会评估为:

x[:, True]
x[:, False]

我认为这不是你想要的。你应该尝试这样的事情:

for i in range(1, 6):
    mask = x[:, i] == -i
    x[:, i][mask] = 100

在整个列上创建一个遮罩,并使用它来更改值。

答案 1 :(得分:0)

如果您担心喷出文字的警告,请将其忽略为警告/异常:

import numpy
import warnings


warnings.simplefilter('default')  # this enables DeprecationWarnings to be thrown


x = numpy.array([[0,1,2,3,4,5],[0,-1,2,3,-4,-5],[0,-1,-2,-3,4,5]])

with warnings.catch_warnings():
    warnings.simplefilter("ignore")  # and this ignores them
    for i in range(1,6):
        x[:,i == -(i)] = 100
print(x)  # just to show that you are actually changing the content

正如您在评论中看到的,有些人没有得到DeprecationWarning。这可能是因为python suppresses developer-only warnings since 2.7

答案 2 :(得分:0)

即使没有警告,你在那里的代码也不会做你想要的。我是循环索引,只有当i == 0时才会等于减去自身,这是永远的。您的测试将始终返回false,将其转换为0.换句话说,您的代码将用100替换每行的第一个元素。

为了让这个工作我会做

for i in range(1, 6):
    col = x[:,i]
    col[col == -i] = 100

请注意,您使用数组的名称进行屏蔽,并且需要将常规索引与屏蔽分开

答案 3 :(得分:0)

正如其他人所说,你的循环并没有按照你的想法去做。我建议你改变代码,使用numpy的花哨索引。

# First, create the "test values" (column index):
>>> test_values = numpy.arange(6)
# test_values is array([0, 1, 2, 3, 4, 5])
#
# Now, we want to check which columns have value == -test_values:
#
>>> mask = (x == -test_values) & (x < 0)
# mask is True wherever a value in the i-th column of x is negative i
>>> mask
array([[False, False, False, False, False, False],
       [False,  True, False, False,  True,  True],
       [False,  True,  True,  True, False, False]], dtype=bool)
#
# Now, set those values to 100
>>> x[mask] = 100
>>> x
array([[  0,   1,   2,   3,   4,   5],
       [  0, 100,   2,   3, 100, 100],
       [  0, 100, 100, 100,   4,   5]])