gpt4 book ai didi

python - Numpy 1-dim 数组与 2-dim 数组,其中一个维度的长度为 1

转载 作者:行者123 更新时间:2023-12-03 23:39:25 33 4
gpt4 key购买 nike

在 Matlab 中没有一维数组的概念。所有数组至少有两个维度。所有“向量”都是“行向量”(1xn 数组)或“列向量”(nx1 数组)。
另一方面,在 NumPy 中,数组也可以是一维的。于是就有了“纯向量”(维度n)、“行向量”(维度1xn)和“列向量”(维度nx1)的概念。
现在我正在从 Matlab 迁移到 Python,这让我很头疼。
例如,考虑我必须移动 n x k(n 通常很大,但 k 可以是 1)矩阵的行的情况,将其称为 A,向下移动一行,然后在第一行添加一行零。
在 Matlab 中我会做

[n, k] = size(A);
B = [zeros(1,k); A(1:end-1,:)];
在 Numpy 中,我希望它不仅适用于二维输入,而且适用于一维输入。
所以一个可行的解决方案是
import numpy as np

if A.ndim == 1:
B = np.concatenate((np.zeros(1), A[:-1]), axis=0)

if A.ndim == 2:
(n, k) = A.shape
B = np.concatenate((np.zeros((1,k)), A[:-1,:]), axis=0)
但这太重了。有没有更好(更简洁)的方法?
更一般地说,我总是有这个问题:如果我编写了一个采用二维数组(n x k)的函数,请将其命名为 arr ,其中 k 很可能是 1,该函数可能会在一维数组上失败(例如,如果我这样做 arr[0,:] )。
但我希望它也适用于一维数组,因为它们在道德上与其中一个维度为 1 的二维数组相同。
当然,一种出路是放一些类似的东西
if arr.ndim == 1
arr = arr.reshape((arr.shape[0],1))
在函数的最开始,这样就可以保证函数有一个二维数组可以使用。
但这并不完全令人满意。例如,我的函数可能会返回一个与输入 (nxk) 形状相同的数组。但如果输入是一维的,我希望它也返回一维的东西,而不是 (nx1)。因此,为了处理这种情况,我需要添加其他冗长的 if 语句和重新整形,这会使我的代码看起来更加沉重和丑陋。
最好的出路是什么?

最佳答案

当涉及到数组大小时,我认为 numpy 的“严格性”(与 MATLAB 相比)是一种优势,我觉得它让很多事情变得更加可预测。
我针对您的第一个问题提出以下解决方案,其中可能包含一些有用的工具来解决 future 的问题。第一个工具是"ellipsis" ( ... )对象,可用于索引。当您在索引中看到这三个点时,您可以认为它替换了尽可能多的 :有必要的。例如,如果 A.shape = (42,2021,69,7)然后 A[..., 1, :]A[:, :, 1, :] 相同.在这里我要补充一点,很明显,每个索引表达式只能使用其中一个。为了编写处理任意维度数组的函数,拥有它是一件非常有用的事情。
第二个(此答案不是必需的)是您可以将其用于 np.ones 之类的东西。或 np.zeros等等你总是有相应的功能np.ones_likenp.zeros_like这让您避免了许多繁琐的计算。
因此,在下文中,我们首先使用这些来创建一个具有正确形状的新数组,而无需进行任何算术运算。我们只需调用np.zeros_like关于我们想要替换的东西(在这种情况下是 A 的最后一个“超行”,但它可以是其中任何一个)。同时,省略号运算符可以方便地处理我们可能存在的任意数量的维度:

import numpy as np  
def f(A):
u = np.zeros_like(A[-1:, ...]) # np.zeros(A[-1:, ...].shape)
v = A[:-1,...]
return np.concatenate([u,v], axis=0)
Try it online!

关于python - Numpy 1-dim 数组与 2-dim 数组,其中一个维度的长度为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66735417/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com