ndarray读写成员变量时,如何通过[]或者[:]定位成员?
发布于 作者:苏南大叔 来源:程序如此灵动~
本文基于python,讨论的是读写ndarray成员时的方法,以及可能的误会产生的错误用法。涉及的是[数字]和[数字:数字]这两种成员变量读法。这里因为思维的习惯定式,就会产生使用的误区,特别是[:]这种用法,会和惯性思维产生很大的碰撞。
![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - ndarray定位成员 苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - ndarray定位成员](/usr/img/water/a1/a102b216995d84e0.png)
大家好,这里是苏南大叔的“程序如此灵动”博客。本文描述如何通过[]定位到ndarray成员。测试环境:win10,python@3.11.0,numpy@1.24.2,pandas@1.5.3。
本文的代码或者结论,把ndarray换成list一样成立。
定位成员方式误区
作为基础类型的list类型,和ndarray这种高级拓展类型,有着千丝万缕的联系,两者之间可以做到相互转换。参考文章:
那么,list和ndarray也都可以使用传统的[]来定位成员,也可以使用[:]这种方式。
- 比如读写二维数组的时候,就是通过
[][]进行定位的(写了两个[]),这个是常识。 - 改成
[:]的时候,就也是通过[:][:]进行定位的,(注意是两个[:])
上面推导出来的第二条结论是错误的,[:]得到的维度比[]多一层。如果使用了[:],那么很可能需要很多个[]或者[:]的组合来定位到同样的位置了。
传统的[]定位成员
这个定位就很简单了,简单明了。测试代码:
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读写成员变量时,如何通过[]或者[:]定位成员? - 第一种定位方式](/usr/img/water/20/20493161c51c2eda.png)
使用[:]定位成员
因为误区在[:],所以这里定义了一个二维数组,然后一步步定位到某个成员。仔细想下面的结论:
原版是个二维数组的话,[:]还是个二维数组,[:][:]还是个二维数组,[:][:][:]还是个二维数组...
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读写成员变量时,如何通过[]或者[:]定位成员? - 第二种定位方式](/usr/img/water/00/00d6d17b547d837b.png)
再解释一次
[:]操作,一直保持原维度不变,并且有容错性,超限不报错。[]操作,会降低到下一个维度,维度减一,超出索引值报错。
测试代码:
import numpy as np
s1 = np.array([["苏", "南", "大", "叔"], ["北", "京", "大", "学"], ["技", "术", "经", "理"]])
print(s1[0:2][8:9]) # 不报错,返回[]
print(s1[0:2][1:2][9]) # 报错![解决了问题,节约了时间!我要为苏南大叔买瓶饮料! - 报错信息 苏南大叔:ndarray读写成员变量时,如何通过[]或者[:]定位成员? - 报错信息](/usr/img/water/9a/9a309aef3addeafb.png)
输出:
[]
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是一条大蟒蛇,掌握它的习性需要付出不断的尝试和努力。