Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于二维阵列填充三维阵列的有效方法是什么?_Python_Arrays_Python 3.x_Pandas_Numpy - Fatal编程技术网

Python 基于二维阵列填充三维阵列的有效方法是什么?

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

假设我有一个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'))

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]将完成这项工作,正如前面提到的。这是因为:列参数在本例中是可选的。但是查看完整的符号是很有用的