Numpy [...,None]

Ent*_*elR 4 python numpy numpy-ndarray

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

   np.ones(shape=feature_set.shape)[...,None]
Run Code Online (Sandbox Code Playgroud)

设置

例如,假设我希望通过使用 numpy 和求解来求解线性回归参数估计:

来自统计学习的要素

假设我有一个特征集形状 (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)
Run Code Online (Sandbox Code Playgroud)

我认为我知道的

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

在此处输入图片说明

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

主要问题

虽然我看到的输出[...,无]给我我想要的,我苦苦寻找的任何信息,什么是真正应该做的。任何人都可以带我了解这段代码的实际含义,None参数在做什么,等等?

谢谢!

jed*_*rds 5

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

省略号文字组件:

点 (...) 表示生成完整索引元组所需的尽可能多的冒号。例如,如果 x 是一个秩为 5 的数组(即它有 5 个轴),则

  • x[1,2,...]相当于x[1,2,:,:,:]
  • x[...,3]x[:,:,:,:,3]
  • x[4,...,5,:]x[4,:,:,5,:]

来源

None组件:

numpy.newaxis

newaxis对象可用于所有切片操作以创建长度为 1 的轴。newaxis是 'None' 的别名,并且可以使用 'None' 代替它,结果相同。

来源

因此,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
Run Code Online (Sandbox Code Playgroud)