2014-08-28 64 views
2

我需要从2D数组中创建一维numpy数组,以便2列中的元素被连接和分隔,数据类型为一个字符串。我可以与np.split做相反的功能,但np.concatenate似乎并不按照我需要的方式工作,并且没有像熊猫那样的'join'函数。使1维数组的字符串中的元素与逗号分隔的2d数组中的字符

这些都是我的阵列,它具有形状(53187L,2L)和(27530L,2L):

dfSTcombined=np.vstack([txx_copy,dfSTA]).T locatsCruSta=np.vstack([locatsID[:,3],locatsID[:,4]]).T

问题随之而来,当我试图比较他们的成员:

dfSTinlocats=np.in1d(locatsCruSta, dfSTcombined)
dfSTinlocats.shape
->(55060L, 2L)
这给出了一个长度的两倍我的预期(55060L = 2 * 27530),因为它分别比较数组中的每列,但我需要同时比较两列。

尝试另一种方法:
test4=np.where(dfSTcombined==locatsCruSta)
-> ValueError: shape mismatch: objects cannot be broadcast to a single shape

所以需要创建一个新的数组与含有从两个柱中的字符串1列,和隔板。

[AR1006, 02](2列)
[AR1024, 05]

应该变成:

['AR1006,02'](1列,虽然我的记号我是不正确的)

的最终目标是要找到一个组的成员另一个使用类似numpy.in1D的东西,然后使用该成员的索引来选择更多的数据来匹配2个巨大的数据集。如果熊猫比较容易,我不会与numpy联系在一起,但我不知道如何比较大熊猫的会员身份。

回答

0

你提到熊猫作为一个选项。我肯定会选择这个库,因为除了其他所有东西之外,它还有一些非常有用的操作字符串的函数(尽管我确信你在NumPy中也可能需要)。

>>> import pandas as pd 
>>> import numpy as np 

让您与NumPy阵列成熊猫数据帧:

>>> arr = np.array([['AR1006', '02'], ['AR1007', '01'], ['AR1008', '03']]) 
>>> df = pd.DataFrame(arr, columns=['a', 'b']) 
>>> df 

     a b 
0 AR1006 02 
1 AR1007 01 
2 AR1008 03 

两列可以很容易地连接起来,用分离器一起,为pd.Series对象:

>>> series = df.a + ", " + df.b 
>>> series 

0 AR1006, 02 
1 AR1007, 01 
2 AR1008, 03 
dtype: object 

你甚至可以如果你喜欢的话,把系列变成一个NumPy数组,并且用np.array(series)

检查系列对象的成员身份也很简单。实际上,您可以使用np.in1d

>>> np.in1d(df.a, df.b) 
array([False, False, False], dtype=bool) 

>>> np.in1d(['02', '01'], df.b) 
array([ True, True], dtype=bool) 
+0

完美,这正是我需要的。我的代码可能是最不可能的'pythonic',但它完成了工作。感谢您提供如此快速的回应。 – Ryan 2014-08-28 21:05:06

+0

完全没问题!很高兴答案对你有用。 – 2014-08-28 21:09:09

0

试试这个。

>>> a 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7], 
     [8, 9]]) 
>>> b 
array([[4, 5], 
     [6, 7]]) 

添加的轴线,使得a可被广播到b并测试equivalancy

>>> c = a == b[:, np.newaxis, :] 
>>> c.shape 
(2, 5, 2) 

使用np.all沿着最后轴线随后沿着结果的最后轴np.any

>>> c = np.all(c, axis = -1) 
>>> np.any(c, axis = (-1)) 
array([ True, True], dtype=bool) 

>>> d 
array([[4, 5], 
     [9, 8]]) 
>>> e = a == d[:, np.newaxis, :] 
>>> e = np.all(e, axis = -1) 
>>> np.any(e, axis = (1,2)) 
array([ True, False], dtype=bool) 
>>> 

>>> f 
array([[ 2, 3], 
     [ 8, 10]]) 
>>> g = a == f[:, np.newaxis, :] 
>>> g = np.all(g, axis = -1) 
>>> g = np.any(g, axis = -1) 
>>> g 
array([ True, False], dtype=bool) 
>>> 

尝试以不同的方式 - 与解释

>>> a 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7], 
     [8, 9]]) 
>>> f 
array([[ 2, 3], 
     [ 8, 10]]) 
  • 添加的轴线a(形状将是(5,1,2)),使得fa可广播
  • 在等效操作中,与每个1×2的a数组相比,f的每个1x2数组将为 。
  • 的对比将发生沿 a第三轴。

结果是一个5x2x2布尔数组(5x1x2 op 2,2 - > 5x2x2)。

>>> g = a[:, np.newaxis, :] == f 
>>> g.shape 
(5, 2, 2) 
  • 你有兴趣在1x2的阵列是相等的任何一点 - 沿第三轴线。
  • 要相等,元素需要为True。沿着第三轴使用np.all结果是5x2布尔数组。
  • 列表示每个1×2阵列f与每个1×2阵列a的比较。

f[0] (array([2, 3])) comaparisons的第一列和f[1]的第二列比较。

>>> g.all(axis = -1) 
array([[False, False], 
     [ True, False], 
     [False, False], 
     [False, False], 
     [False, False]], dtype=bool) 

以确定是否任一f 1x2的阵列中a发现, 使用np.any沿第一轴线。

>>> np.any(g.all(axis = -1), axis = 0) 
array([ True, False], dtype=bool) 

以确定是否任何a 1x2的阵列是等于f任一1×2阵列, 使用np.any沿第二轴线。

>>> np.any(g.all(axis = -1), axis = 1) 
array([False, True, False, False, False], dtype=bool) 
>>> 
>>> np.any(g.all(axis = -1), axis = 1, keepdims = True) 
array([[False], 
     [ True], 
     [False], 
     [False], 
     [False]], dtype=bool) 

最后np.zeronp.where可以给你其中f或者1x2的元件中发现的a 行(多个)的索引 - >行1。

>>> np.nonzero(np.any(g.all(axis = -1), axis = 1)) 
(array([1]),) 
>>>>>> np.nonzero(np.any(g.all(axis = -1), axis = 1, keepdims = True)) 
(array([1]), array([0])) 

广播:

+0

我试过你的代码,它在你给的例子中有效,但是我不确定它在做什么!我需要考虑这一点... – Ryan 2014-08-28 21:02:31

+0

我花了相当多的时间去了解它是如何工作的。很确定我看到这用于另一个SO答案。我会发布对我有帮助的链接,因为我找到它们。 – wwii 2014-08-28 21:32:06

+0

似乎我并没有完全笔直 - 请参阅编辑。 – wwii 2014-08-28 21:54:31

相关问题