'numpy.str_' 和 'float' 实例之间不支持“<=”
'<=' not supported between instances of 'numpy.str_' and 'float'
我有两个数组,第一列包含元素名称,最后三列包含坐标。我想读取每一行,如果坐标在我定义的框中,我想保存整行,包括元素名称。如果我不包含元素名称,则此代码可以完美运行。这是一个 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: 由于我随机选择了数组,因此代码无法给出输出。
有什么好疑惑的。如图所示,两个数组包含字符串:
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]
语法更清晰可靠。
当您从包含字符串的列表创建数组时,整个数组的数据类型都是字符串。
没有字符串列的数组可以做成浮点数:
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
好的,我解决了这个问题。在循环中将坐标的dtype
由str
改为float
即可解决问题。我做了以下更改:
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])
我有两个数组,第一列包含元素名称,最后三列包含坐标。我想读取每一行,如果坐标在我定义的框中,我想保存整行,包括元素名称。如果我不包含元素名称,则此代码可以完美运行。这是一个 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: 由于我随机选择了数组,因此代码无法给出输出。
有什么好疑惑的。如图所示,两个数组包含字符串:
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]
语法更清晰可靠。
当您从包含字符串的列表创建数组时,整个数组的数据类型都是字符串。
没有字符串列的数组可以做成浮点数:
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
好的,我解决了这个问题。在循环中将坐标的dtype
由str
改为float
即可解决问题。我做了以下更改:
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])