Python 基于二维阵列填充三维阵列的有效方法是什么?
假设我有一个2d数组Python 基于二维阵列填充三维阵列的有效方法是什么?,python,arrays,python-3.x,pandas,numpy,Python,Arrays,Python 3.x,Pandas,Numpy,假设我有一个2d数组 a = np.array([[0,2,3],[4,2,1]]) 维度是实例数*3,其中2d数组中的值表示数据帧中的行索引 b = np.empty(2,3,4) 我有一个数据帧: df = pd.DataFrame(np.array([[10, 10, 10, 10], [11, 11, 11, 11], [12, 12, 12, 12], [13, 13, 13, 13], [14, 14, 14, 14]]), columns = list('ABCD')) Ou
a = np.array([[0,2,3],[4,2,1]])
维度是实例数*3
,其中2d数组中的值表示数据帧中的行索引
b = np.empty(2,3,4)
我有一个数据帧
:
df = pd.DataFrame(np.array([[10, 10, 10, 10], [11, 11, 11, 11], [12, 12, 12, 12], [13, 13, 13, 13], [14, 14, 14, 14]]), columns = list('ABCD'))
Out[23]:
A B C D
0 10 10 10 10
1 11 11 11 11
2 12 12 12 12
3 13 13 13 13
4 14 14 14 14
现在我有了一个零3d数组,我尝试用pandas dataframe
中的值填充3d数组
b = np.empty(2,3,4)
维度是number\u of_instances*3*number\u of_features
,其中number\u of_features
通过2d数组中相应的行索引从数据帧中提取
理想情况下,我希望b看起来像:
Out[24]:
array([[[10, 10, 10, 10],
[12, 12, 12, 12],
[13, 13, 13, 13]],
[[14, 14, 14, 14],
[12, 12, 12, 12],
[11, 11, 11, 11]]])
填充此3d阵列的最有效方法是什么?看起来您只需要索引
df.to_numpy()[a]
那么:
df.loc[a.ravel()].values.reshape((2,3,4))
输出:
array([[[10, 10, 10, 10],
[12, 12, 12, 12],
[13, 13, 13, 13]],
[[14, 14, 14, 14],
[12, 12, 12, 12],
[11, 11, 11, 11]]])
您需要的是官方numpy文档中的高级索引
例如,对于您的工作示例,您应该执行以下操作
首先,通过调用df.values访问与数据帧的值相对应的numpy数组。然后,简单地做:
df.values[[[0,1,3],[4,2,1]],:]
你就完了
上面的索引将两个对象的列表传递给数组。第一个是[[0,1,3],[4,2,1]],第二个是:。第一个用于索引1轴(行),第二个用于索引2轴(列)
:符号仅返回所有列
现在,对于行,有两个列表:[[0,1,3],[4,2,1]]。这个构造将返回两个数组,就像您想要的一样。第一个数组将包含行0、1和3,第二个数组将包含行4、2和1
Numpy很强大。通过利用索引的功能,您可以做很多事情
编辑:注意变量a中已经有列表[[0,1,3],[4,2,1]]。因此,df.values[a]将完成这项工作,正如前面提到的。这是因为:列参数在本例中是可选的。但是查看完整的符号是很有用的