我有两个ndarray。第一个ndarray在一列中包含字符串,在另一列中包含浮点值。第二个ndarray只包含一列字符串值。
例如:
Array1 Array2
"abc" 1.000 "abc"
"fsfds" -5.000 "qw"
"svs" 2.094 "svs"
"dfdsge" 3.348 "dd"
我的问题是,如何比较Array1和Array2中的匹配字符串值,然后从Array1返回相应的浮点值?
我试过set(Array1)&设置(Array2)以查找唯一元素,但不知道如何提取浮点值。 numpy中有功能吗?
谢谢。
答案 0 :(得分:1)
将示例转换为数组的最简单方法是将其复制粘贴为多行字符串并使用my
对其进行解析:
genfromtxt
使用In [344]: txt=b'''"abc" 1.000 "abc"
...: "fsfds" -5.000 "qw"
...: "svs" 2.094 "svs"
...: "dfdsge" 3.348 "dd" '''
In [346]: np.genfromtxt(txt.splitlines(),dtype=None)
Out[346]:
array([(b'"abc"', 1. , b'"abc"'), (b'"fsfds"', -5. , b'"qw"'),
(b'"svs"', 2.094, b'"svs"'), (b'"dfdsge"', 3.348, b'"dd"')],
dtype=[('f0', 'S8'), ('f1', '<f8'), ('f2', 'S5')])
推导出列dtype,并创建结构化数组。我可以将它分成2个数组,一个有2个字段,另一个有1.这些都是1d。
dtype=None
您不清楚如何比较文本列。使用此数据看起来合理的一个简单的方法就是逐个元素,即简单的In [347]: arr1, arr2 = _[['f0','f1']], _['f2']
In [348]: arr1
Out[348]:
array([(b'"abc"', 1. ), (b'"fsfds"', -5. ), (b'"svs"', 2.094),
(b'"dfdsge"', 3.348)],
dtype=[('f0', 'S8'), ('f1', '<f8')])
In [349]: arr2
Out[349]:
array([b'"abc"', b'"qw"', b'"svs"', b'"dd"'],
dtype='|S5')
。
==
使用此布尔掩码,我可以轻松选择In [350]: arr1['f0']==arr2
Out[350]: array([ True, False, True, False], dtype=bool)
:
arr1
让我们看看我是否可以将它们变成对象数组。
In [351]: arr1[_]
Out[351]:
array([(b'"abc"', 1. ), (b'"svs"', 2.094)],
dtype=[('f0', 'S8'), ('f1', '<f8')])
我们可以得到相同的面具:
In [372]: array1 = np.array(arr1.tolist(),dtype=object)
In [373]: array2 = np.array(arr2.tolist(),dtype=object)
In [374]: array1
Out[374]:
array([[b'"abc"', 1.0],
[b'"fsfds"', -5.0],
[b'"svs"', 2.094],
[b'"dfdsge"', 3.348]], dtype=object)
In [375]: array2
Out[375]: array([b'"abc"', b'"qw"', b'"svs"', b'"dd"'], dtype=object)
获得面具的另一种方法:
In [376]: array1[:,0]==array2
Out[376]: array([ True, False, True, False], dtype=bool)
In [377]: array1[_,:]
Out[377]:
array([[b'"abc"', 1.0],
[b'"svs"', 2.094]], dtype=object)
在这种情况下,它产生相同的东西
实际上要获取In [378]: np.in1d(array2,array1[:,0])
Out[378]: array([ True, False, True, False], dtype=bool)
中的array1
行(按任意顺序),我们需要切换顺序:
array2
查看In [389]: np.in1d(array1[:,0],array2[[1,0,3,2]])
Out[389]: array([ True, False, True, False], dtype=bool)
和相关数组in1d
函数,了解更多提示和详细信息。
在任何情况下,使用set
或列选择来获取可与其他数组中的字符串进行比较的1d字符串数组。
答案 1 :(得分:0)
您可以使用数组比较作为第一个维度的索引来选择所需的行。我不确定你是如何拥有包含字符串和浮点数的ndarray,但是这里是我们设置它的示例,因此第一行和最后一行在第一列中具有相同的值。
import numpy as np
array_1 = np.random.randn(4, 2)
array_2 = np.random.randn(4)
array_2[3] = array_1[3, 0]
array_2[0] = array_1[0, 0]
print(array_1, array_2)
print(array_1[array_1[:, 0] == array_2, 1])
这给出了
[[ 0.76170733 -1.40708366]
[-1.42535617 -1.03982291]
[ 0.67999753 -0.92733875]
[ 0.96474552 -1.95639871]]
[ 0.76170733 0.95046454 0.1548689 0.96474552]
[-1.40708366 -1.95639871]
答案 2 :(得分:0)
我认为列表理解可以解决这个问题:
Output=[i[1] for i in Array1 if i[0] in Array2]