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相关文章,请点击: