2016-04-12 3 views
0

У меня есть матрица NumPy 3465 x 50157 и я пытаюсь протестировать определенное вычисление, используя каждое уникальное значение в выбранном столбце матрицы в качестве порогового значения. Рассмотрим следующий пример:NumPy unique() возвращающий массив вместо скаляра

feat_num = 4 
thresholds = np.unique(X[:, feat_num]) 

for thresh in thresholds: 
    y_left = np.array([ 
     y[i] for i in range(X.shape[0]) if X[i, feat_num] < thresh 
    ]) 

При выполнении этого NumPy дает мне следующее сообщение об ошибке:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

Я подтвердил, что X[i, feat_num] является скаляром, так что не проблема там. Однако по какой-то причине thresh оценивает массив какого-либо типа. Я не вижу, как это может быть, учитывая, что X - это просто большая матрица целых чисел.

Кто-нибудь видит, что происходит?

+0

Что такое y? или что такое X только одна форма массива описывается в вашем вопросе –

+0

И 'thresh' также является скаляром? – hpaulj

ответ

0

Проблема, вероятно, в том, что вы используете numpy matrix, а не numpy ndarray. Последние - более общие звери, и я предлагаю вам использовать их. Одним из преимуществ типа matrix является то, что алгебраические операции работают так, как вы ожидаете, от матриц, но это редко бывает так, как и нужно, и даже в таких случаях numpy.dot может использоваться для работы с объектами ndarray.

Таким образом, проблема заключается в том, что колонка кусочек вашей matrix вектор-столбец, т.е. matrix формы (N,1) (что эквивалентно списку списков). Если исходный массив был ndarray, то срез столбец будет иметь форму (N,), то это было бы 1d ndarray (совместим с плоскими списками), а не фактический вектор-столбец:

>>> import numpy as np 
>>> X = np.random.rand(3,3) 
>>> Xmat = np.asmatrix(X) 
>>> 
>>> print(X[:,1]) 
[ 0.28797057 0.56186287 0.58674852] 
>>> print(Xmat[:,1]) 
[[ 0.28797057] 
[ 0.56186287] 
[ 0.58674852]] 

цикл над вектор-столбец будет дайте вам списки, а не скаляры, вопреки вашим ожиданиям.

Если вы не используете матричные операции в любом месте, я настоятельно рекомендую переключиться на объекты np.array, которые также должны решить вашу текущую проблему.

Смежные вопросы