转置一维 NumPy 数组

2024-12-27 08:47:00
admin
原创
140
摘要:问题描述:我使用 Python 和 NumPy,在“转置”方面遇到了一些问题:import numpy as np a = np.array([5,4]) print(a) print(a.T) 调用a.T不会转置数组。a例如,如果是,[[],[]]则转置正确,但我需要的是的转置[...,...,...]。解...

问题描述:

我使用 Python 和 NumPy,在“转置”方面遇到了一些问题:

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)

调用a.T不会转置数组。a例如,如果是,[[],[]]则转置正确,但我需要的是的转置[...,...,...]


解决方案 1:

它完全按照预期工作。1D数组的转置仍然是1D数组!(如果您习惯使用 matlab,它基本上没有 1D 数组的概念。 Matlab 的“1D”数组是 2D。)

如果您想将一维向量转换为二维数组,然后转置它,只需用 对其进行切片即可np.newaxis(或者None,它们是相同的,newaxis只是更具可读性)。

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

不过一般来说,你永远不需要担心这一点。如果你只是出于习惯,添加额外的维度通常不是你想要的。Numpy 在进行各种计算时会自动广播一维数组。当你只想要一个向量时,通常不需要区分行向量和列向量(它们都不是向量。它们都是二维的!)。

解决方案 2:

使用两个括号对而不是一个。这将创建一个可以转置的二维数组,这与使用一个括号对创建的一维数组不同。

import numpy as np    
a = np.array([[5, 4]])
a.T

更详尽的例子:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

使用numpy的shape方法看看这里发生了什么:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

解决方案 3:

对于一维数组

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

一旦你理解了 -1 的意思是“根据需要的行数”,我发现这是“转置”数组最易读的方式。如果你的数组是高维的,只需使用a.T

解决方案 4:

您可以通过将现有向量包裹在一组额外的方括号中来将其转换为矩阵......

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy 也有一个matrix类(参见数组与矩阵)...

matrix(v).T ## transpose a vector into a matrix

解决方案 5:

numpy 1D 数组——>列/行矩阵:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

正如@joe-kington 所说,为了便于阅读,您可以None用进行替换。np.newaxis

解决方案 6:

要将一维数组“转置”为二维列,可以使用numpy.vstack

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

它也适用于原始列表:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

解决方案 7:

而是使用arr[:,None]创建列向量

解决方案 8:

您只能转置二维数组。您可以使用numpy.matrix来创建二维数组。这已经晚了三年,但我只是在增加可能的解决方案集:

import numpy as np
m = np.matrix([2, 3])
m.T

解决方案 9:

有一种方法未在答案中描述,但在该方法的文档numpy.ndarray.transpose中描述:

对于一维数组,这没有影响,因为转置向量只是相同的向量。要将一维数组转换为二维列向量,必须添加额外的维度。np.atleast2d(a).T 可以实现这一点,a[:, np.newaxis] 也可以。

可以这样做:

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

在我看来这比使用 更好newaxis

解决方案 10:

转置函数的作用基本上是交换数组的形状和步幅:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

对于 1D numpy 数组(秩为 1 的数组),其形状和步幅为 1 元素元组,无法交换,并且这种 1D 数组的转置会将其原封不动地返回。相反,您可以将“行向量”(形状为 的 numpy 数组(1, n))转置为“列向量”(形状为 的 numpy 数组(n, 1))。要实现这一点,您必须先将 1D numpy 数组转换为行向量,然后交换形状和步幅(转置)。下面是一个执行此操作的函数:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

例子:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

当然,您不必这样做,因为您有一个 1D 数组,您可以直接(n, 1)通过a.reshape((-1, 1))或将其重塑为数组a[:, None]。我只是想演示如何转置数组。

解决方案 11:

另一个解决方案.... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

b = np.array([a]).T

数组([[1],[2],[4]])

解决方案 12:

该函数的名称numpy是column_stack。

>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])

解决方案 13:

我只是整合了上述帖子,希望它能帮助其他人节省一些时间:

下面的数组有(2, )维度,它是一个一维数组,

b_new = np.array([2j, 3j])  

转置一维数组的方法有两种:


用“np.newaxis”或无切片!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

另一种写法,上面没有T操作。!

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

包装 [ ] 或使用 np.matrix,意味着添加一个新的维度。!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

解决方案 14:

要转置示例中的一维数组(平面数组),可以使用以下np.expand_dims()函数:

>>> a = np.expand_dims(np.array([5, 4]), axis=1)
array([[5],
       [4]])

np.expand_dims()将为所选轴添加一个维度。在本例中,我们使用axis=1,它添加了一个列维度,从而有效地转置了原始平面数组。

解决方案 15:

正如上面的一些评论所提到的,一维数组的转置是一维数组,因此转置一维数组的一种方法是将数组转换为矩阵,如下所示:

np.transpose(a.reshape(len(a), 1))
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3998  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2749  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   85  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   96  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   83  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用