当前位置: 首页 > 知识库问答 >
问题:

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

蓬思博
2023-03-14

我最近遇到了几个错误,因为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个答案

孟增
2023-03-14

引用文件:

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

因此,当你有像(4,)这样的形状时,它意味着它的第一个维度中有4个元素。从你的例子来看,这是有道理的?

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

柴宏浚
2023-03-14

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

形状的元组中的每个项表示一个轴。如果其中有一个项目,则表示数组为一维(1轴),否则将为二维数组。当您执行a.shape=[4,1]操作时,您只需将1D数组转换为2D:

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]])
 类似资料:
  • 我注意到,对于具有3个元素的秩1数组,numpy返回(3,)作为形状。我知道这个元组表示数组沿每个维度的大小,但为什么不是(3,1)?

  • 问题内容: 在contextlib.py,我看到ExitStack类正在呼叫经由类型的对象方法(),而不是直接方法调用给定对象()。 我不知道为什么或为什么不。 例如, 发生错误时,它能否提供更好的异常跟踪? 它只是特定于某些模块作者的编码风格吗? 它对性能有好处吗? 它可以避免一些带有复杂类型层次结构的工件/副作用吗? 问题答案: 首先,这就是您执行操作时发生的事情,而不仅仅是在类型上查找特殊方

  • 在2006年的模糊C代码竞赛中。请解释sykes2。c 有一个语句“

  • 有两种代码,其中vscode会自动将x:放入系统中。出来println我的问题是x是什么:为什么vs代码会把它放在代码中--示例代码1- 示例代码2--

  • 问题内容: 考虑以下示例: 我不确定Java语言规范中是否有一项规定要加载变量的先前值以便与右侧()进行比较,该变量应按照方括号内的顺序进行计算。 为什么第一个表达式求值,而第二个表达式求值?我本来希望先被评估,然后再与自身()比较并返回。 这个问题与Java表达式中子表达式的求值顺序不同,因为这里绝对不是“子表达式”。需要 加载 它以进行比较,而不是对其进行“评估”。这个问题是特定于Java的,

  • 这个问题与Java表达式中子表达式的求值顺序不同,因为在这里肯定不是“子表达式”。需要加载它进行比较,而不是“求值”。这个问题是特定于Java的,表达式来自一个真实的项目,而不是通常为棘手的面试问题而设计的牵强附会的不切实际的构造。它应该是比较和替换习语的一行替换 它比x86 CMPXCHG指令还要简单,因此在Java中应该使用更短的表达式。