我有一个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,我怎么能避免这个警告?
答案 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]])