2017-02-09 117 views
-1

目前我有一个具有形状(33,)的元素X.我想将其改为(33,501),因为我知道每行都有501个元素。铁。 X[0] = [0, 1, 0, 0, .. 0, 1] 我试过Python - 更改对象形状?

np.reshape(X, (33,501)) 

但它的错误与ValueError: total size of new array must be unchanged。即使每行都是501长。

+2

'X'没有任何“行”,它的形状是'(33)'...显然你是错误。 –

+0

什么类型是'X'和'X [0]'?可能工作的是'X = np.array(X)' –

+0

'X.dtype'返回'dtype('O')','X [0]'是一个列表。 –

回答

1

要从开始的结构不是2-d阵列但含有列表作为其元素的1 d阵列。这看起来可能相似,但实际上完全不同。

一个典型的(有例外)m×n数组是一个mn元素的线性块,还有一些允许numpy以正确的方式解释索引的“元数据”(像[i,j])。

相比之下,您的数组是一个1d的对象引用块(c语言中的指针),因此如果要解析单个元素,则会添加另一个间接级别。首先检索列表,然后检索其元素。

阵列不提供适当的numpy数组所提供的大部分便利性和速度改进,所以最好将其转换。

通常,np.array工厂将兼容长度的嵌套序列转换为尽可能深的数组。你的情况是个例外,因为在技术上它已经是一个数组,所以np.array只是浅拷贝它(它复制列表引用而不是列表本身),包括形状。

绕过的一个方法是将之前投放到列表:

np.array(list(original_array)) 
0

我的猜测是你有一个列表,其中有33个列表,其中501长。

你可以将它转换为2维数组(矩阵)或数据框,可以用几种不同的方式完成;一个简单的一个将是:

df = pd.DataFrame([]) 

counter = 0 

for array in X: 

    df['column_%d' %counter] = array 

    counter = counter + 1