我需要从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的束缚,但我不知道如何比较熊猫的成员资格。
答案 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)),以便a
和
f
可播放。a
的每个1x2数组都是
与a
的每个1x2数组进行比较。>>> g = a[:, np.newaxis, :] == f
>>> g.shape
(5, 2, 2)
。结果是一个5x2x2布尔数组(5x1x2 op 2,2 - > 5x2x2)。
True
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.where
或a
可以为您提供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}}
广播: