2015-09-02 3 views
0

У меня есть массив (матрица) N x M numpy. Ниже приведен пример с массивом 3 х 5:Заменить значения в определенных столбцах массива numpy

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. Как я могу избежать этого предупреждения без опускания вниз?

+0

Выполнение этого действия не дает предупреждения по 1.9.2 – bernie

+0

Да, но как насчет 1.8.2? –

+0

@bernie OP [вероятно, на более ранней версии python] (https://docs.python.org/3/whatsnew/2.7.html#changes-to-the-handling-of-deprecation-warnings). Похоже, что с тех пор, как предупреждение разработчика было отключено по умолчанию. – KobeJohn

ответ

3

Я не понимаю, что ваш код пытается сделать:

i == -(i)

будет оценивать что-то вроде этого:

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

Я не подумайте, что это то, что вы хотите. Вы должны попробовать что-то вроде этого:

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

Создайте маску на всей колонке и используйте ее для изменения значений.

0

Если вы обеспокоены предупреждение извергает текст, а затем игнорировать его как предупреждение/Exception:

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

0

Даже без предупреждения код, который у вас там, не будет делать то, что вы хотите. i - это индекс цикла и будет равен минус сам, только если i == 0, что никогда не будет. Ваш тест будет всегда возвращать ложь, которая отливается в 0. Другими словами, ваш код будет заменить первый элемент каждой строки с 100

Чтобы получить эту работу, я бы

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

Обратите внимание, что вы используете имя массива для маскировки и что вам нужно отделить обычную индексацию от маскировки

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]]) 
Смежные вопросы