2016-02-06 2 views
2

После прочтения этой Converting NumPy array into Python List structure?, у меня есть:Проверка на равных списках

import numpy as np 
print np.array(centroids).tolist() 
print "here\n" 
print old_centroids 

print type(np.array(centroids).tolist()) 
print type(old_centroids) 

, который дает:

[[-0.30485176069166947, -0.2874083792427779, 0.0677763505876472], ...,[0.09384637511656496, -0.015282322735474268, -0.05854574606104108]] 
here 
[array([-0.30485176, -0.28740838, 0.06777635]), ..., array([-0.03415291, -0.10915068, 0.07733185]), array([ 0.09384638, -0.01528232, -0.05854575])] 
<type 'list'> 
<type 'list'> 

Однако, когда я делаю:

return old_centroids == np.array(centroids).tolist() 

я получаю это Ошибка:

return old_centroids == np.array(centroids).tolist() 
ValueError: The truth value of an array with more than one element is ambiguous. 

Как это исправить?

Тип centroids является <type 'numpy.ndarray'> и они вычисляются следующим образом:

from sklearn import decomposition 
centroids = pca.transform(mean_centroids) 

Обратите внимание, что без PCA, я бы просто сделать:

return old_centroids == centroids 

EDIT_0:

Check if two unordered lists are equal предлагает set(), таким образом, я сделал:

return set(old_centroids) == set(np.array(centroids).tolist()) # or set(centroids) 

и получил:

TypeError: unhashable type: 'list' 

ответ

1

Поскольку вы сравниваете с плавающей точкой ЗНАЧЕНИЯ лучше использовать numpy.allclose() и, следовательно, сохранить свои ценности в numpy массив формы:

return np.allclose(np.array(old_centroids), np.array(centroids)) 

(обратите внимание, что я преобразовал список 1D-массивов в 2D-массив; Технически, вы можете применить allclose() отдельно для каждой пары элементов из old_centroids и centroids, если вы хотите)

Редактировать (на основе комментария):. если old_centroids и centroids могут иметь различные формы, проверить его перед allclose():

old = np.array(old_centroids) 
new = np.array(centroids) 
return old.shape == new.shape and np.allclose(old, new) 
+0

'г = все (less_equal (абс (ху), Atol + RTOL * абс (у))) ValueError: операнды не могут передаваться вместе с формами (25,0) (25,3)' , Может быть, потому что в первый раз «old_centroids» - это всего лишь список из 25 пустых списков? – gsamaras

+0

Ну, это наверняка не заполнено пустым списком в распечатке, который у вас есть в вашем вопросе. Добавьте пример исполняемого файла, если есть другие варианты содержимого «old_centroids». Если это единственный вариант, просто проверьте, чтобы размер массива был больше 0 перед сравнением. – fjarri

+0

fjarri, он будет слишком длинным, и мой вопрос уже большой. 'old_centroids' состоит из 25 пустых списков на самой первой итерации ** только **, а затем становится такой, какой вы видите в моем вопросе, разве мы не можем обойти это? С фиктивной проверкой, возможно, перед вызовом 'allclose()'? – gsamaras

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