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

本文基于python,讨论的是读写ndarray成员时的方法,以及可能的误会产生的错误用法。涉及的是[数字][数字:数字]这两种成员变量读法。这里因为思维的习惯定式,就会产生使用的误区,特别是[:]这种用法,会和惯性思维产生很大的碰撞。

苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - ndarray定位成员
ndarray读写成员变量时,如何通过[]或者[:]定位成员?(图4-1)

大家好,这里是苏南大叔的“程序如此灵动”博客。本文描述如何通过[]定位到ndarray成员。测试环境:win10python@3.11.0numpy@1.24.2pandas@1.5.3

本文的代码或者结论,把ndarray换成list一样成立。

定位成员方式误区

作为基础类型的list类型,和ndarray这种高级拓展类型,有着千丝万缕的联系,两者之间可以做到相互转换。参考文章:

那么,listndarray也都可以使用传统的[]来定位成员,也可以使用[:]这种方式。

  • 比如读写二维数组的时候,就是通过[][]进行定位的(写了两个[]),这个是常识。
  • 改成[:]的时候,就 也是通过[:][:]进行定位的,(注意是两个[:]

上面推导出来的第二条结论是错误的,[:]得到的维度比[]多一层。如果使用了[:],那么很可能需要很多个[]或者[:]的组合来定位到同样的位置了。

传统的[]定位成员

这个定位就很简单了,简单明了。测试代码:

import numpy as np

s1 = np.array([["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]])
# s1 = [["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]]
print(s1[0])             # ['苏' '南' '大' '叔']
print(s1[0][0])          # 苏
print(s1[1])             # ['北' '京' '大' '学']
print(s1[1][1])          # 京
print(s1[0,0])           # 苏
print(s1[1,1])           # 京

s1 = np.arange(27).reshape(-1,3,3)
print(s1.shape)
print(s1[0,0,0])          # 0
print(s1[1,2,1])          # 16

苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - 第一种定位方式
ndarray读写成员变量时,如何通过[]或者[:]定位成员?(图4-2)

使用[:]定位成员

因为误区在[:],所以这里定义了一个二维数组,然后一步步定位到某个成员。仔细想下面的结论:
原版是个二维数组的话,[:]还是个二维数组,[:][:]还是个二维数组,[:][:][:]还是个二维数组...

import numpy as np

s1 = np.array([["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]])
# s1 = [["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]]
print(s1[0:2])             # [['苏' '南' '大' '叔'] ['北' '京' '大' '学']]
print(s1[0:2][4])          # ['北' '京' '大' '学']
print(s1[0:2][1:2])        # [['北' '京' '大' '学']]
print(s1[0:2][1:2][0])     # ['北' '京' '大' '学']
print(s1[0:2][1:2][0][1])  # 京
s1[0:2][1:2][1:2]是在[0:2]里面再次挑选。

苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - 第二种定位方式
ndarray读写成员变量时,如何通过[]或者[:]定位成员?(图4-3)

再解释一次

  • [:]操作,一直保持原维度不变,并且有容错性,超限不报错。
  • []操作,会降低到下一个维度,维度减一,超出索引值报错。

测试代码:

import numpy as np
s1 = np.array([["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]])
print(s1[0:2][8:9])        # 不报错,返回[]
print(s1[0:2][1:2][9])     # 报错

苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - 报错信息
ndarray读写成员变量时,如何通过[]或者[:]定位成员?(图4-4)

输出:

[]
Traceback (most recent call last):
  File "C:\Users\sunan\Desktop\demo\py\t.py", line 4, in <module>
    print(s1[0:2][1:2][9])     # 报错
IndexError: index 9 is out of bounds for axis 0 with size 1

写作初衷

写本文的原因呢,也是看网上一位大牛的文章,然后觉得写的挺有道理的,然后亲自试了一下,好像不是那么回事。当然了,如果这位大牛认为我的文章有问题,也可以指出来,相互学习嘛。

这位大牛的文章链接是:

看这位"昊虹君"大牛的网站上文章也蛮多的,都是一些高科技的文章,而且还有引流变现的途径,在某些方面是值得学习的。

结束语

python是一条大蟒蛇,掌握它的习性需要付出不断的尝试和努力。

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

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

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

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