【问题标题】:Why use arrays of shape (x,) rather than (x,1)? [duplicate]为什么使用形状为 (x,) 而不是 (x,1) 的数组? [复制]
【发布时间】:2017-08-28 07:28:42
【问题描述】:

由于 numpy 数组的形状为 (x,),我最近遇到了几个错误 - 这些可以通过下面的 sn-p 轻松修复

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,) 是一维数组的默认形状?

【问题讨论】:

  • 一维数组应该是一维的,但(x, 1)(1, x) 是二维数组。它们有两个维度,其中一个设置为 1。您能更具体地说明您遇到的错误类型吗?我怀疑这些错误实际上可能是特性:)
  • 最好修复它所在的错误。

标签: python numpy


【解决方案1】:

shape 的元组中的每个项目表示一个轴。当您有一个项目时,这意味着您的数组是一维的(1 个轴),否则它将是一个二维数组。当您执行a.shape = [4,1] 时,您只是将一维数组转换为二维:

In [26]: a = np.array([1,2,3,4])
In [27]: a.shape = [4,1]

In [28]: a.shape        
Out[28]: (4, 1)

In [29]: a
Out[29]: 
array([[1],
       [2],
       [3],
       [4]])

【讨论】:

  • (4,1) 数组的“冗长”显示是不将其设为“向量”默认值的一个很好的理由。
【解决方案2】:

我怀疑这个问题会出现,因为您来自 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]

【讨论】:

    【解决方案3】:

    引用文档:

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

    所以,当你有像(4, ) 这样的形状时,这意味着它的第一个维度中有 4 个元素。从您的示例中是否有意义?

    相反,如果我们有形状,如你所说,(4, 1),那么这意味着第一个维度(axis=1,在 NumPy 术语中)有 4 个元素,第二个维度(在 NumPy 术语中,axis= 0) 其中有 1 个元素,但情况并非如此(对于一维数组)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2018-01-04
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      相关资源
      最近更新 更多