多维np数组的列表序列

2024-06-16 10:11:28 发布

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

我有一个熊猫数据帧df。 一列是一组数字(作为字符)除以空格

我需要将其转换为多维numpy阵列

我想:

df.A.apply(lambda x: np.array(x.split(" "))).values

会成功的

实际上它返回一个数组的数组

array([array(['70', '80', '82', ..., '106', '109', '82'], dtype='<U3'),
   array(['151', '150', '147', ..., '193', '183', '184'], dtype='<U3'),

这似乎不是我所期待的,而是我应该期待的

array([[[['70', '80', '82', ..., '106', '109', '82'],['151', '150', '147', ..., '193', '183', '184']....

第一:我该怎么做才能让我的daya变成第二种格式? 第二:实际上我对这两种数据结构之间的差异有点困惑。归根结底,多维数组就是数组的数组。从这个角度来看,这两个似乎是相同的结构。但我肯定我错过了什么

例如:

df=pd.DataFrame({"A":[0,1,2,3],"B":["1 2 3 4","5 6 7 8","9 10 11 12","13 14 15 16"]})

    A   B
0   0   "1 2 3 4"
1   1   "5 6 7 8"
2   2   "9 10 11 12"
3   3   "13 14 15 16"

此命令

df.B.apply(lambda x: np.array(x.split(" "))).values

给出:

array([array(['1', '2', '3', '4'], dtype='<U1'),
   array(['5', '6', '7', '8'], dtype='<U1'),
   array(['9', '10', '11', '12'], dtype='<U2'),
   array(['13', '14', '15', '16'], dtype='<U2')], dtype=object)

而不是

 array([['1', '2', '3', '4'],
   ['5', '6', '7', '8'],
   ['9', '10', '11', '12'],
   ['13', '14', '15', '16']], dtype='<U2')

问题1:如何获得最后一个结构? 问题2:2和2之间的区别是什么?从技术上讲,这两个阵列都是阵列的阵列


Tags: 数据lambdadfnp数字数组结构array
1条回答
网友
1楼 · 发布于 2024-06-16 10:11:28

您可以直接使用df.A上的^{}和参数expand=True进行操作,然后使用values例如:

df = pd.DataFrame({'A':['70 80 82','151 150 147']})
print (df.A.str.split(' ',expand=True).values)
array([['70', '80', '82'],
       ['151', '150', '147']], dtype=object)

使用您的方法,如果所有字符串包含相同数量的数字,您仍然可以使用^{}获得相同的结果:

print (np.stack(df.A.apply(lambda x: np.array(x.split(" "))).values))

编辑:对于不同之处,我不确定我能解释得足够好,但我尝试了。让我们定义

arr1 = df.A.str.split(' ',expand=True).values
arr2 = df.A.apply(lambda x: np.array(x.split(" "))).values

首先,您可以注意到形状不同:

print(arr1.shape)
(2, 3)
print(arr2.shape)
(2,)

所以我想说的一个区别是arr2是一个1D元素数组,碰巧也是1D数组。当您使用values构造arr2时,它从序列df.A.apply(lambda x: np.array(x.split(" ")))构造1D数组,而不查看该序列中的类型。对于arr1,区别在于df.A.str.split(' ',expand=True)不是序列而是数据帧,因此使用values将构造一个形状为(number of rows,nb of columns)的二维数组。在这两种情况下,您都使用了values,但在序列的单元格中实际拥有一个数组(正如在您的方法中创建的那样)不会创建2D数组

然后,如果您想要访问任何元素(例如第一行第二个元素),您可以通过arr1[0,1]来完成,而arr2[0,1]将抛出一个错误,因为此结构不是2D数组,但是arr2[0][1]给出了很好的答案,因为您访问了arr2中第一个1D数组的第二个元素[1]

我希望它能给出一些解释

相关问题 更多 >