脾气暴躁[...,None]

时间:2018-07-01 23:16:36

标签: python numpy numpy-ndarray

我发现自己需要向现有的numpy数组添加功能,这引发了一个问题,涉及以下代码的最后一部分实际在做什么:

   np.ones(shape=feature_set.shape)[...,None]

设置

作为一个例子,假设我希望通过使用numpy并求解来解决线性回归参数估计:

From Elements of Statistical Learning

假定我有一个特征集形状(50,1),一个目标形状为(50,),并且希望使用目标变量的形状为拦截值添加一列。

它看起来像这样:

# Create random target & feature set
y_train = np.random.randint(0,100, size = (50,))
feature_set = np.random.randint(0,100,size=(50,1))

# Build a set of 1s after shape of target variable
int_train = np.ones(shape=y_train.shape)[...,None]

# Able to then add int_train to feature set 
X = np.concatenate((int_train, feature_set),1)

我认为我知道的东西

当我包含[...,None]与不使用它时,我看到输出的差异。在这里:

enter image description here

第二个版本在需要相同维数的输入数组周围返回错误,最终我偶然发现了使用[...,None]的解决方案。

主要问题

虽然我看到[...,None]的输出给出了我想要的东西,但我正在努力寻找有关实际上应该做的任何信息。谁能告诉我这段代码的实际含义, None 参数在做什么等等?

谢谢!

2 个答案:

答案 0 :(得分:2)

[..., None]的切片由两个“快捷方式”组成:

省略号文字部分:

  

点(...)代表产生完整索引元组所需的多个冒号。例如,如果x是等级5的数组(即,它具有5个轴),则

     
      
  • x[1,2,...]等同于x[1,2,:,:,:]
  •   
  • x[...,3]x[:,:,:,:,3]
  •   
  • x[4,...,5,:]x[4,:,:,5,:]
  •   

Source

None组件:

  

numpy.newaxis

     

newaxis对象可用于所有切片操作中,以创建长度为一的轴。 newaxis是“无”的别名,可以用“无”代替它,结果相同。

Source

因此,arr[..., None]采用维度为N的数组,并在“末尾”“添加”维度,以得到维度为N+1的数组。

示例:

import numpy as np

x = np.array([[1,2,3],[4,5,6]])
print(x.shape)          # (2, 3)

y = x[...,None]
print(y.shape)          # (2, 3, 1)

z = x[:,:,np.newaxis]
print(z.shape)          # (2, 3, 1)

a = np.expand_dims(x, axis=-1)
print(a.shape)          # (2, 3, 1)

print((y == z).all())   # True
print((y == a).all())   # True

答案 1 :(得分:1)

考虑以下代码:

np.ones(shape=(2,3))[...,None].shape 

如您所见,“无”短语将(2,3)矩阵更改为(2,3,1)张量。实际上,它将矩阵置于张量的LAST索引中。

如果您使用

np.ones(shape=(2,3))[None, ...].shape

将矩阵放在张量的FIRST‌索引中