我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文讨论:python下的list以及numpy下的ndarray的区别。通常意义上,这两个都可以理解为传统意义上的数组。但是,既然有区别,两者又有具体什么样的区别呢?这些数组仅仅是写法上的区别吗?

苏南大叔:python代码,如何理解ndarray类型以及shape维度属性? - ndarray-shape
python代码,如何理解ndarray类型以及shape维度属性?(图2-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文通过对python内的list以及ndarray的对比,理解两者之间的区别。测试环境:win10python@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进行初始化。

苏南大叔:python代码,如何理解ndarray类型以及shape维度属性? - 基本定义
python代码,如何理解ndarray类型以及shape维度属性?(图2-2)

认清楚看明白

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]]

相关文章

综述

python中,listndarray两者都可以是多重数组,都可以使用[]进行元素访问或者修改。

  • 传统的多重数组就是list,每层元素数量可以不一致。
  • 如果要求数量一致,就是ndarray类型。个人理解着,ndarray就是个带着框架模具萝卜坑的array

其中,为了ndarray数据初始化:

  • ndarray可以使用.randomint()初始化多层shape的数据。
  • ndarray从具体的数据初始化的话,记得满足同层元素数量相等的原则的前提下,还需要注意函数的唯一参数的最外侧由[]进行包裹,否则list类型会被识别成tuple,进而导致错误失败。

更多python相关文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python