制作一维字符串数组,其中元素用逗号分隔,数字为numpy中的2 d数组

时间:2014-08-28 19:34:40

标签: python arrays numpy membership

我需要从2D数组中创建一维numpy数组,这样两列中的元素就会被连接和分离,数据类型就是一个字符串。我可以使用np.split执行相反的功能,但np.concatenate似乎不能按我需要的方式工作,并且没有像pandas那样的'join'函数。

这些是我的阵列,其形状(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

所以我需要创建一个新数组,其中包含两列中的字符串和一个分隔符。

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

应该成为:

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

最终目标是使用类似numpy.in1D之类的内容查找另一个组的成员资格,然后使用该成员资格的索引来选择更多数据以匹配2个庞大的数据集。如果它在熊猫中更容易,我不会受到numpy的束缚,但我不知道如何比较熊猫的成员资格。

2 个答案:

答案 0 :(得分:0)

你提到熊猫是一种选择。我肯定会选择这个库,因为除了其他一切之外,它还有一些非常有用的函数来操作字符串(虽然我也很确定你想要的东西在NumPy中也是如此)。

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

将您的NumPy数组转换为Pandas DataFrame:

>>> 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

如果你愿意的话,你甚至可以用np.array(series)将系列变成NumPy数组。

检查系列对象的成员资格也很简单。实际上,您可以使用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)

答案 1 :(得分:0)

试试这个。

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

添加一个轴,以便a可以广播到b并测试等效性

>>> 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
  • 将轴添加到f(形状将为(5,1,2)),以便af 可播放
  • 在等效操作中,a的每个1x2数组都是 与a的每个1x2数组进行比较。
  • 比较将在沿着 的第三轴进行 >>> g = a[:, np.newaxis, :] == f >>> g.shape (5, 2, 2)

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

True
  • 您对1x2阵列相等的任何点感兴趣 - 沿第三轴。
  • 相同,两个元素必须为np.all
  • 沿第三轴使用f结果为5x2布尔数组。
  • 列表示a的每个1x2数组与f[0] (array([2, 3]))的每个1x2数组的比较。

f[1] comaparisons的第一列和>>> g.all(axis = -1) array([[False, False], [ True, False], [False, False], [False, False], [False, False]], dtype=bool) 比较的第二列。

f

确定a中是否找到了np.any的1x2数组, 沿第一轴使用>>> np.any(g.all(axis = -1), axis = 0) array([ True, False], dtype=bool)

a

确定f的任何1x2数组是否等于np.any的1x2数组, 沿第二轴使用>>> 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.zero

最后np.wherea可以为您提供f行的索引 其中找到>>> 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])) 的1x2元素 - >第1行。

{{1}}

广播: