Skip to main content
 首页 » 编程设计

python之在 for 循环中追加数组

2025年05月04日21sxdcgaq8080

我有一个包含 1000 行和 1000 列的数据框。我正在尝试使用 for 循环从该数据帧生成一个 numpy 数组,我使用 for 循环在每个周期随机选择 5 列。我需要附加或连接每个周期生成的每个数组(1000 行和 5 列)。但是,如果不首先指定维度,就不可能创建 numpy 数组。

我试过下面的代码:

import numpy as np 
import pandas as pd 
 
 
df = pd.DataFrame(np.random.choice([0.0, 0.05], size=(1000,1000))) 
 
l =  np.array([]) 
 
for i in range(0,100): 
 rand_cols = np.random.permutation(df.columns)[0:5] 
 df2 = df[rand_cols].copy() 
 l = np.append(l, df2, axis=0) 

但是,我收到以下错误:

ValueError: all the input arrays must have same number of  
dimensions 

这段代码总结了我正在做的事情,但是,根据这个例子,我需要的结果是一个 1000 行和 500 列的数组,它是通过每个 for 循环生成的每个数组的串联生成的循环。

请您参考如下方法:

List append 总是优于 np.append。它更快,更容易正确使用。

但让我们更详细地查看您的代码:

In [128]: df = pd.DataFrame(np.random.choice([0.0, 0.05], size=(1000,1000)))     
In [129]: l = np.array([])                                                       
In [130]: rand_cols = np.random.permutation(df.columns)[0:5]                     
In [131]: rand_cols                                                              
Out[131]: array([190, 106, 618, 557, 514]) 
In [132]: df2 = df[rand_cols].copy()                                             
In [133]: df2.shape                                                              
Out[133]: (1000, 5) 
In [134]: l1 = np.append(l, df2, axis=0)                                         
--------------------------------------------------------------------------- 
ValueError                                Traceback (most recent call last) 
<ipython-input-134-64d82acc3963> in <module> 
----> 1 l1 = np.append(l, df2, axis=0) 
 
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in append(arr, values, axis) 
   4692         values = ravel(values) 
   4693         axis = arr.ndim-1 
-> 4694     return concatenate((arr, values), axis=axis) 
   4695  
   4696  
 
ValueError: all the input arrays must have same number of dimensions 

由于您指定了轴,所有 np.append 正在做的是:

np.concatenate([l, df2], axis=0) 

l 是 (0,) 形状,df2 是 (1000,5)。 1d 和 2d,因此有关尺寸的投诉。

从二维 l 数组开始:

In [144]: l = np.zeros((0,5))                                                    
In [145]: np.concatenate([l, df2], axis=0).shape                                 
Out[145]: (1000, 5) 
In [146]: np.concatenate([df2, df2], axis=0).shape                               
Out[146]: (2000, 5) 

我认为 np.append 应该被弃用。我们看到太多 SO 错误。正如您的案例所示,很难创建正确的初始数组。 np.array([]) 仅在构建一维数组时有效。再加上重复连接很慢,每次都会创建一个全新的数组。