python代码,如何理解ndarray类型以及shape维度属性?
发布于 作者:苏南大叔 来源:程序如此灵动~本文讨论:python
下的list
以及numpy
下的ndarray
的区别。通常意义上,这两个都可以理解为传统意义上的数组。但是,既然有区别,两者又有具体什么样的区别呢?这些数组仅仅是写法上的区别吗?
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文通过对python
内的list
以及ndarray
的对比,理解两者之间的区别。测试环境:win10
,python@3.6.8
。
list
类型
传统的数组写法[]
,在python
里面不叫array
,而是叫list
,它和set
/tuple
很相似。具体可以参考下面的文章:
这里是list
类型的定义举例:
import numpy as np
a = [1, 2, 3] # <class 'list'>
aa = [a, [4, 5, 6]] # <class 'list'>
aa = [[4],[3,4,5,6]] # <class 'list'>
# print(aa.shape) # AttributeError: 'list' object has no attribute 'shape'
从上面可以看出:
list
类型,可以表现为多重数组。list
类型,相同层级的数据个数可以不同。list
类型,没有shape
属性。
ndarray
类型
这个类型存在于numpy
中,使用的时候,可能需要import
语句。ndarray
可以从普通数组定义初始化,也可以从list
进行初始化。
认清楚看明白
ndarray
重新定义的时候,必须保证每层元素数量一致。
a = [[1, 2], [2, 3]] # [[1, 2], [2, 3]] <class 'list'>
aa = np.array(a) # <class 'numpy.ndarray'>
而且要认清自己传递的是个tuple
,还是个list
。区别就是:最外侧还有个[]
。
aa = np.array([[1, 2], [3, 4]]) # <class 'numpy.ndarray'>
下面的是个错误的示例:
aa = np.array([1,2],[3,4]) # TypeError: Field elements must be 2- or 3-tuples, got '3'
a = [[1], [2, 3]] # [[1], [2, 3]] <class 'list'>
# aa = np.array(a) # TypeError: unsupported operand type(s) for -: 'list' and 'int'
可能获得错误提示信息:
reating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated.
TypeError: Field elements must be 2- or 3-tuples, got '3'
可以选择随机初始化
如果是处于测试的目的,可以通过.randint()
函数初始化,具体可以参考:
a1 = np.random.randint(1, 3, size=(2, 3)) # <class 'numpy.ndarray'>
# [[2 2 2]
# [2 1 2]]
这个例子就是生成一个2行3列的ndarray
矩阵,元素从[1,3)之间随机变化。另外一个例子就是:
a1 = np.random.randint(1, 3, size=(2, 3,4)) # <class 'numpy.ndarray'>
# [[[2 1 1 1]
# [2 2 2 1]
# [1 1 2 1]]
# [[2 1 2 2]
# [1 1 2 1]
# [2 2 2 1]]]
ndarray
类型的shape
属性
苏南大叔个人理解着,ndarray
就是个稍稍高级点的数组,它可以形成矩阵。用于描述ndarray
到底是几维的属性,就是.shape
。这个返回值是个tuple
类型的。
对于一维数组,其返回值是(cnt,)
。也就是说,比日常的理解,多个逗号。这个是元组类型的特殊写法而已。详情请参考:
和传统的多重数组不同的地方,就是同一个维度上的元素个数必须是相同的。如果难以理解的话,可以想象最常见的x,y
矩阵。
当然了,ndarray
的维度也是可以无限扩展的。一维二维还是比较好理解。但是,三维四维五维等,就很难理解了。虽然不常见,但是ndarray
在语法上也是支持的。
测试代码如下:
a1 = np.array([[1, 2], [2, 3]]) # (2, 2)
a2 = np.random.randint(1, 3, size=(2, 3, 4)) # (2, 3, 4)
print(a1.shape,a2.shape)
exit()
访问元素
访问数据,都可以使用[][]
来进行数据元素访问。
a = [[1, 2], [2, 3]]
a[0][0] = 9
print(a) # [[9, 2], [2, 3]]
a1 = np.array([[1, 2], [2, 3]])
a1[0][0] = 9
print(a1)
# [[9 2]
# [2 3]]
ndarray可以做加减法
而且这种ndarray
可以做加减法,但是list
是不能做加减法的,会报错。
测试代码:
import numpy as np
b1 = np.array([2, 3, 4]) # ValueError: operands could not be broadcast together with shapes (3,) (2,)
b1 = np.array([[2, 3],[3,4]])
b2 = np.array([1, 1])
b3 = b1-b2
b4 = b1+b2
print(b3, b4)
上面的结果输出是:
[[1 2]
[2 3]]
[[3 4]
[4 5]]
相关文章
- https://newsn.net/say/python-tuple.html
- https://newsn.net/say/python-set-vs-list.html
- https://newsn.net/say/python-set-diff.html
综述
在python
中,list
和ndarray
两者都可以是多重数组,都可以使用[]
进行元素访问或者修改。
- 传统的多重数组就是
list
,每层元素数量可以不一致。 - 如果要求数量一致,就是
ndarray
类型。个人理解着,ndarray
就是个带着框架模具萝卜坑的array
。
其中,为了ndarray
数据初始化:
ndarray
可以使用.randomint()
初始化多层shape的数据。ndarray
从具体的数据初始化的话,记得满足同层元素数量相等的原则的前提下,还需要注意函数的唯一参数的最外侧由[]
进行包裹,否则list
类型会被识别成tuple
,进而导致错误失败。
更多python
相关文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。