我有一个包含 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/