关于numpy数组行专业和列专业和numpy数组和列表的区别的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于numpy和list的区别;定义多维数组,取数组元素;numpy数值类型;数组切
关于numpy数组行专业和列专业和numpy数组和列表的区别的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于numpy和list的区别;定义多维数组,取数组元素;numpy数值类型;数组切片;数组反转、numpy学习笔记 - numpy数组的常见用法、numpy数组行列拼接、NumPy:使用nditer迭代numpy数组的外部尺寸等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- numpy数组行专业和列专业(numpy数组和列表的区别)
- numpy和list的区别;定义多维数组,取数组元素;numpy数值类型;数组切片;数组反转
- numpy学习笔记 - numpy数组的常见用法
- numpy数组行列拼接
- NumPy:使用nditer迭代numpy数组的外部尺寸
numpy数组行专业和列专业(numpy数组和列表的区别)
我在了解如何numpy
存储其数据时遇到了麻烦。考虑以下:
>>> import numpy as np
>>> a = np.ndarray(shape=(2,3),order='F')
>>> for i in xrange(6): a.itemset(i,i+1)
...
>>> a
array([[ 1.,2.,3.],[ 4.,5.,6.]])
>>> a.flags
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
这就是说a
是列主(F_CONTIGUOUS
),因此,在内部a
应如下所示:
[1,4,2,5,3,6]
这就是本词汇表中所说的。令我困惑的是,如果我尝试以a
线性方式访问的数据,则会得到:
>>> for i in xrange(6): print a.item(i)
...
1.0
2.0
3.0
4.0
5.0
6.0
在这一点上,我不确定该F_CONTIGUOUS
标志告诉我们什么,因为它不遵守该顺序。显然,python中的所有内容都是行专业的,当我们想以线性方式进行迭代时,可以使用迭代器flat
。
问题如下: 假设我们有一个数字列表,例如:1,6
,我们如何以列主要顺序创建numpy
形状数组(2,3)
?那就是我如何得到一个看起来像这样的矩阵
array([[ 1.,3.,5.],[ 2.,4.,6.]])
我真的很希望能够在列表上进行线性迭代,然后将它们放入新创建的ndarray
。这样做的原因是因为我将读取按列主要顺序设置的多维数组文件。
numpy和list的区别;定义多维数组,取数组元素;numpy数值类型;数组切片;数组反转
>>> import numpy as np
>>> a = list(range(10,15))
>>> a
[10, 11, 12, 13, 14]
>>> b = np.arange(5)
>>> b
array([0, 1, 2, 3, 4])
>>> b.shape
(5,)
>>> b.dtype
dtype(''int32'')
>>> #定义多维数组,取数组元素
>>> c = np.array([a,b])
>>> c
array([[10, 11, 12, 13, 14],
[ 0, 1, 2, 3, 4]])
>>> c.size
10
>>> e = np.array([c,c*2])
>>> e
array([[[10, 11, 12, 13, 14],
[ 0, 1, 2, 3, 4]],
[[20, 22, 24, 26, 28],
[ 0, 2, 4, 6, 8]]])
>>> d = [a,b]
>>> d
[[10, 11, 12, 13, 14], array([0, 1, 2, 3, 4])]
>>> #numpy数值类型
>>> type(d)
<class ''list''>
>>> type(d[1])
<class ''numpy.ndarray''>
>>> type(e)
<class ''numpy.ndarray''>
>>> e.dtype #查看e中的元素类型
dtype(''int32'')
>>> e[1].dtype
dtype(''int32'')
>>> e.shape
(2, 2, 5)
>>> e[1]
array([[20, 22, 24, 26, 28],
[ 0, 2, 4, 6, 8]])
>>> e[1,0]
array([20, 22, 24, 26, 28])
>>> e[1,0,3]
26
>>> b = np.arange(5,dtype=np.int64)
>>> b
array([0, 1, 2, 3, 4], dtype=int64)
>>> #数据类型对象
>>> e.dtype.type
<class ''numpy.int32''>
>>> #所占字节数
>>> e.dtype.itemsize
4
>>> #字符码
>>> e.dtype.char
''l''
>>> #数组切片
>>> b[2:5]
array([2, 3, 4], dtype=int64)
>>> e[0,0,2:5]
array([12, 13, 14])
>>> e[0,0,0:5:2]
array([10, 12, 14])
>>> #数组反转
>>> e[::-1]
array([[[20, 22, 24, 26, 28],
[ 0, 2, 4, 6, 8]],
[[10, 11, 12, 13, 14],
[ 0, 1, 2, 3, 4]]])
numpy学习笔记 - numpy数组的常见用法
# 纯Python
def pythonSum(n):
# 对列表循环计算
a = [x for x in range(n)]
b = [x for x in range(n)]
c = []
for i in range(len(a)):
a[i] = i ** 2
b[i] = i ** 3
c.append(a[i] +b[i])
return c
# numpy
def numpySum(n):
# 直接对数组操作
a = np.arange(n) ** 2
b = np.arange(n) ** 3
c = a + b
return c
# 效率比较
size = 1000
# pythonSum()
start = datetime.now() # 起始时间
c = pythonSum(size)
delta = datetime.now() - start # pythonSum()的运行时间
print("The last two elements: ", c[-2:]) # 打印最后两个元素,确认准确性
print("PythonSum elapsed time in microseconds: ", delta.microseconds) # 以微秒为单位显示运行时间
# pythonSum结果
The last two elements: [995007996, 998001000]
PythonSum elapsed time in microseconds: 999
# numpySum()
start = datetime.now()
c = numpySum(size)
delta = datetime.now() - start
print("The last two elements: ", c[-2:])
print("NumpySum elapsed time in microseconds: ", delta.microseconds)
# numpySum结果
The last two elements: [995007996 998001000]
NumpySum elapsed time in microseconds: 0
可以看出使用numpy数组的速度超快~
numpy数组行列拼接
方法一
使用 np.c_[]
和 np.r_[]
分别添加行和列
方法二
np.concatenate((a1, a2, …), axis=0)
方法三
使用 np.insert(a, 0, values=b, axis=1)
ps:只能插入行向量?
方法四
使用np.column_stack((a,b))
import numpy as np
a = np.arange(9).reshape(3, 3)
b = np.zeros((1, 3))
c = np.ones((3, 1))
np.r_[a, b]
np.c_[a, c]
np.concatenate((a, b), axis=0)
np.concatenate((a, c), axis=1)
np.insert(a, 0, values=b, axis=0)
np.insert(a, 0, values=b, axis=1) # 这里也是插入b(行向量)
np.column_stack((a, c))
NumPy:使用nditer迭代numpy数组的外部尺寸
我无法遍历numpy数组的外轴。
import numpy as npa = np.arange(2*3).reshape(2,3)it = np.nditer(a)for i in it: print i
正如人们所期望的那样:
012345
但是,我希望输出为三分之二,这样我就遍历了外轴:
(0, 1, 2)(3, 4, 5)
我知道可以通过多种方式实现此目标,但是在仔细阅读nditer文档之后,我似乎找不到使用nditer的解决方案。我以此为契机学习nditer。因此,我宁愿不使用其他解决方案,除非它确实更有效或更有效。
答案1
小编典典用简单的方式控制迭代比较容易for
:
In [17]: aOut[17]: array([[0, 1, 2], [3, 4, 5]])In [18]: for row in a: ...: print(row) ...: [0 1 2][3 4 5]
这样做nditer
很尴尬。除非您需要cython
如页面结尾所述使用广播,否则nditer
不会提供任何速度优势。即使有了cython
,我的速度也memoryviews
超过了nditer
。
看看np.ndindex
。它创建一个尺寸减小的虚拟数组,并对此进行nditer:
In [20]: for i in np.ndindex(a.shape[0]): ...: print(a[i,:]) ...: [[0 1 2]][[3 4 5]]
得到它了:
In [31]: for x in np.nditer(a.T.copy(), flags=[''external_loop''], order=''F''): ...: print(x)[0 1 2][3 4 5]
就像我说的-尴尬
我们今天的关于numpy数组行专业和列专业和numpy数组和列表的区别的分享已经告一段落,感谢您的关注,如果您想了解更多关于numpy和list的区别;定义多维数组,取数组元素;numpy数值类型;数组切片;数组反转、numpy学习笔记 - numpy数组的常见用法、numpy数组行列拼接、NumPy:使用nditer迭代numpy数组的外部尺寸的相关信息,请在本站查询。
本文标签: