为什么使用形状(x,)而不是(x,1)的数组?

时间:2017-04-03 12:19:20

标签: python numpy

由于numpy数组的形状(x,),我最近遇到了一些错误 - 这些可以通过下面的代码段轻松修复

a = np.array([1,2,3,4]) #this form produced a bug
a.shape 
>>> (4,)  
a.shape = [4,1] #but this change fixed it 

但它确实让我想知道,为什么(x,)是1D数组的默认形状?

3 个答案:

答案 0 :(得分:2)

forEach()元组中的每个项表示一个轴。如果你有一个项目意味着你的数组是1维(1轴),否则它将是一个2D数组。执行var data = [[{"10":{"key1":1,"key2":2,"key3":3},"11":{"key1":1,"key2":2,"key3":3},"12":{"key1":1,"key2":2,"key3":3}},{},{}],[{"10":{"key1":1,"key2":2,"key3":3},"11":{"key1":1,"key2":2,"key3":3},"12":{"key1":1,"key2":2,"key3":3}},{},{}]] var result = data.reduce(function(r, e, i) { if (i == 0) r = r.concat(e) else { e.forEach(function(a, j) { Object.keys(a).forEach(function(key) { if (!r[j][key]) r[j][key] = a[key] else { Object.keys(a[key]).forEach(function(k) { r[j][key][k] += a[key][k] }) } }) }) } return r; }, []) console.log(result)时,您只需将1D数组转换为2D:

shape

答案 1 :(得分:1)

我怀疑这个问题即将出现,因为你来自Matlab背景,其中所有内容都被视为一个矩阵。在Matlab中,所有1D数据集都被视为行向量或列向量,并且索引被短路,因此指定单个索引将两者都视为1D列表。

Numpy本身并不处理矩阵,而是使用嵌套列表。列表列表与Matlab的矩阵具有相似的解释,但存在关键差异。例如,如果你只给它一个索引,Numpy就不会对你指的是哪个元素做任何假设,无论嵌套列表的深度如何,索引始终都是相同的。

import numpy as np

arr = np.array([1, 2, 3, 4])
print(arr)
>> [1 2 3 4]
print(arr[0])
>> 1

arr.shape = [4, 1]
print(arr)
>> [[1]
>>  [2]
>>  [3]
>>  [4]]
print(arr[0])
>> [1]

arr.shape = [1, 4]
print(arr)
>> [[1 2 3 4]]
print(arr[0])
>> [1 2 3 4]

答案 2 :(得分:0)

从文档中引用:

  

形状:整数元组
     形状元组的元素给出了长度       相应的数组维度。

所以,当你的形状像(4, )时,意味着它的第一个维度中有4个元素。从你的例子开始就有意义吗?

相反,如果我们将形状(如你所说)设为(4, 1),则意味着第一个维度(轴= 1,在NumPy术语中)有4个元素和第二个维度(在NumPy术语中, axis = 0)中有1个元素,不是这种情况(对于1D数组)