python - 在 for 循环中追加数组

标签 python pandas numpy

我有一个包含 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([]) 仅在构建一维数组时有效。再加上重复连接很慢,每次都会创建一个全新的数组。

关于python - 在 for 循环中追加数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55561608/

相关文章:

python - 如何获取 QTreeWidget 可见区域中显示的所有项目?

python - 转换结构化数组中的日期元素

python - num2cell() 的 python/numpy 等价物是什么?

python - 预期单例 : hr. employee(1, 2)

python - 锁定表(或使用事务?)进行付款

python - Pandas Dataframe 从分组中选择随机行,并找到每个分组的平均值

python - 保留 N 次首次出现

python - teradatasql : runtime/cgo: could not obtain pthread_keys

Python - 在每一行的不同位置切片数组

python - 如何使用 Selenium、Python 在表格的每一行上执行脚本