比较两个不同尺寸的ndarray

时间:2017-09-19 21:40:09

标签: python numpy multidimensional-array

我有两个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中有功能吗?

谢谢。

3 个答案:

答案 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]