在numpy中用逗号将元素从二维数组中分隔开,使字符串组成一维数组

2024-10-02 14:23:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从一个2D数组生成一个1D numpy数组,这样2列中的元素被连接和分离,数据类型是字符串。我可以用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

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

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

应该变成:

['AR1006,02'](1列,尽管我的符号不正确)

最终目标是使用类似于numpy.in1D的方法在另一个组中找到一个组的成员,然后使用该成员资格的索引来选择更多的数据来匹配两个巨大的数据集。如果能在熊猫身上更容易些,我就不喜欢纽比了,但我不知道如何比较熊猫的会员资格。在


Tags: 数据方法字符串numpynp成员数组shape
2条回答

试试这个。在

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

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

^{pr2}$

沿最后一个轴使用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可广播。在
  • 在等价运算中,f的每个1x2数组将是 与a的每个1x2数组进行比较。在
  • 比较将沿着新的的第三个轴进行 a。在

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

>>> g = a[:, np.newaxis, :] == f
>>> g.shape
(5, 2, 2)
  • 你对1x2数组在第三个轴上相等的点感兴趣。在
  • 要相等,两个元素都需要是True。在
  • 沿着第三个轴使用np.all得到一个5x2布尔数组。在
  • 列表示f的每个1x2数组与a的每个1x2数组的比较。在

第一列用于f[0] (array([2, 3]))比较,第二列用于f[1]比较。在

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

{1x2>在np.any。在

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

要确定a的任何1x2数组是否等于f的1x2数组, 沿第二个轴使用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.zero或{}可以给出a行的索引 其中f的1x2元素位于第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]))

广播:

你提到熊猫是个选择。我当然会选择这个库,因为除此之外,它还有一些非常有用的函数来处理字符串(尽管我确信你想要的在NumPy中也是可能的)。在

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

将你的NumPy数组放入Pandas数据帧:

^{pr2}$

可以很容易地将两列与分隔符一起连接到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)

相关问题 更多 >