«<=» не поддерживается между экземплярами «numpy .str_» и «float» - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть два массива, первый столбец содержит имя элемента, а последние три столбца содержат координаты. Я хочу прочитать каждую строку, и если координаты находятся в поле, которое я определил, я хочу сохранить всю строку, включая имя элемента. Если я не включаю имя элемента, этот код работает отлично. Вот MWE:

import numpy as np
array1 = np.array([['O', '0.919775', '3.7032729999999994', '6.436484'],
       ['O', '3.295445', '0.22673200000000016', '8.697384'],
       ['C', '5.553644', '2.607080999999999', '4.798966999999999']],
      dtype='<U32')
array2 = np.array([['C', '7.748108', '0.8001009999999997', '4.791696999999999'],
       ['O', '12.701898', '3.257845999999999', '0.6352019999999996'],
       ['H', '13.696655', '3.614818999999999', '-0.1844650000000012'],
       ['H', '12.209518', '4.530944999999999', '1.5239319999999985']],
      dtype='<U32')

cell_a = 6.613
cell_b = 8.358
cell_c = 9.617

list_array = (array1,array2)
for j in list_array:
    for i in range(len(array1)):
        if j[i][1] <= cell_a and j[i][1] >= 0:
            if j[i][2] <= cell_b and j[i][2] >= 0:
                if j[i][3] <= cell_c and j[i][3] >= 0:
                    print(j[i])

И я получаю следующую ошибку:

'<=' not supported between instances of 'numpy.str_' and 'float'

Я не понимаю, j[i][0] содержит строку, и я я не работаю с ним ...

PS: код не может выдавать, поскольку я выбрал массивы случайным образом.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Что удивительного. Два массива, как показано, содержат строки:

In [318]: array1[0]                                                                                    
Out[318]: array(['O', '0.919775', '3.7032729999999994', '6.436484'], dtype='<U32')
In [319]: array1[0][1]                                                                                 
Out[319]: '0.919775'
In [320]: array1[0][1]<cell_a                                                                          
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-320-73400e758be3> in <module>
----> 1 array1[0][1]<cell_a

TypeError: '<' not supported between instances of 'numpy.str_' and 'float'

Python не может сравнивать строку с числом!

Кстати, в numpy мы предпочитаем обращаться к элементам с :

In [321]: array1[0, 1]                                                                                 
Out[321]: '0.919775'

здесь использование [0][1] также работает, но синтаксис [0,1] более ясный и надежный.

Когда вы создаете массив из списка, который содержит строки, весь массив имеет строковый тип d.

Массив без строкового столбца можно сделать плавающим:

In [322]: array1[:,1:]                                                                                 
Out[322]: 
array([['0.919775', '3.7032729999999994', '6.436484'],
       ['3.295445', '0.22673200000000016', '8.697384'],
       ['5.553644', '2.607080999999999', '4.798966999999999']],
      dtype='<U32')
In [323]: arr = array1[:,1:].astype(float)                                                             
In [324]: arr                                                                                          
Out[324]: 
array([[0.919775, 3.703273, 6.436484],
       [3.295445, 0.226732, 8.697384],
       [5.553644, 2.607081, 4.798967]])
In [325]: arr[0,0]<=cell_a                                                                             
Out[325]: True
0 голосов
/ 15 апреля 2020

Хорошо, я исправил проблему. Изменение dtype координат с str на float в l oop решает проблему. Я сделал следующие изменения:

for j in list_array:
    for i in range(len(array1)):
        if float(j[i][1]) <= cell_a and float(j[i][1]) >= 0:
            if float(j[i][2]) <= cell_b and float(j[i][2]) >= 0:
                if float(j[i][3]) <= cell_c and float(j[i][3]) >= 0:
                    print(j[i])
...