Ben*_*Ben 279 python arrays numpy
我无法弄清楚如何使用我通常使用列表的方式使用数组或矩阵.我想创建一个空数组(或矩阵),然后一次添加一列(或行).
目前,我能找到的唯一方法就是:
mat = None
for col in columns:
if mat is None:
mat = col
else:
mat = hstack((mat, col))
Run Code Online (Sandbox Code Playgroud)
如果它是一个列表,我会做这样的事情:
list = []
for item in data:
list.append(item)
Run Code Online (Sandbox Code Playgroud)
有没有办法为NumPy数组或矩阵使用这种表示法?
Ste*_*ons 395
你有一个错误的心智模型来有效地使用NumPy.NumPy数组存储在连续的内存块中.如果要向现有数组添加行或列,则需要将整个数组复制到新的内存块,从而为要存储的新元素创建间隙.如果重复完成构建数组,则效率非常低.
在添加行的情况下,最好的办法是创建一个与数据集最终一样大的数组,然后逐行添加数据:
>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1., 2.],
[ 2., 3.],
[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
Run Code Online (Sandbox Code Playgroud)
Gre*_*all 87
NumPy数组是与列表非常不同的数据结构,旨在以不同的方式使用.您的使用hstack
效率可能非常低......每次调用它时,现有数组中的所有数据都将复制到新数据中.(该append
功能将有同样的问题.)如果你想在一个时间来建立你的矩阵一列,你可能是最好关闭,以保持它在一个列表中,直到它完成,然后才将其转换成一个数组.
例如
mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
Run Code Online (Sandbox Code Playgroud)
item
可以是列表,数组或任何可迭代的,只要每个item
元素具有相同数量的元素即可.
在这种特殊情况下(data
有一些可迭代的矩阵列)你可以简单地使用
mat = numpy.array(data)
Run Code Online (Sandbox Code Playgroud)
(另请注意,使用list
作为变量名可能不是因为它掩盖好习惯内置这个名字,这可能会导致错误类型.)
编辑:
如果由于某种原因你确实想要创建一个空数组,你可以使用 numpy.array([])
,但这很少有用!
Fra*_*urt 45
要在NumPy中创建一个空的多维数组(例如,一个2D数组m*n
来存储矩阵),以防你不知道m
要追加多少行,并且不关心Stephen Simmons提到的计算成本(即重新构建每个附加的数组),你可以将你想要追加的维度挤压到0 : X = np.empty(shape=[0, n])
.
这种方式你可以使用例如(m = 5
我们假设在创建空矩阵时我们不知道n = 2
):
import numpy as np
n = 2
X = np.empty(shape=[0, n])
for i in range(5):
for j in range(2):
X = np.append(X, [[i, j]], axis=0)
print X
Run Code Online (Sandbox Code Playgroud)
这会给你:
[[ 0. 0.]
[ 0. 1.]
[ 1. 0.]
[ 1. 1.]
[ 2. 0.]
[ 2. 1.]
[ 3. 0.]
[ 3. 1.]
[ 4. 0.]
[ 4. 1.]]
Run Code Online (Sandbox Code Playgroud)
小智 24
我调查了很多,因为我需要在我的一个学校项目中使用numpy.array作为一个集合,我需要初始化为空...我在Stack Overflow上没有找到任何相关的答案,所以我开始涂鸦的东西.
# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)
Run Code Online (Sandbox Code Playgroud)
结果将是:
In [34]: x
Out[34]: array([], dtype=float64)
Run Code Online (Sandbox Code Playgroud)
因此,您可以直接初始化np数组,如下所示:
In [36]: x= np.array([], dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
Ped*_*ram 21
要创建空 NumPy 数组而不定义其形状,您可以执行以下操作:
arr = np.array([])
Run Code Online (Sandbox Code Playgroud)
第一个是首选,因为您知道您将使用它作为 NumPy 数组。np.ndarray
NumPy随后将其转换为类型,而不需要额外的[]
“维度”。
为了向数组添加新元素,我们可以这样做:
arr = np.append(arr, 'new element')
Run Code Online (Sandbox Code Playgroud)
请注意,在 python 的背景中,不存在没有定义其形状的数组之类的东西。正如 @hpaulj 提到的,这也构成了一个一阶数组。
您可以使用追加功能.对于行:
>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],
[1, 2, 3]])
Run Code Online (Sandbox Code Playgroud)
对于列:
>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],
[1, 2, 3, 15]])
Run Code Online (Sandbox Code Playgroud)
编辑
当然,正如其他答案中所提到的,除非你在矩阵/数组上做一些处理(例如反转),每当你向它添加一些东西时,我只会创建一个列表,追加到它然后将其转换为阵列.
这是使 numpys 看起来更像 Lists 的一些解决方法
np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)
Run Code Online (Sandbox Code Playgroud)
输出:数组([ 2., 24.])
归档时间: |
|
查看次数: |
831291 次 |
最近记录: |