python编程笔记
整体注意点
- 一切皆对象,对象的概念贯穿整个python设计中。
- 可变对象与不可变对象。可变对象指的是在数据类型的内存地址上可以直接修改,不可变则不能修改。不可变对象最典型的有元组、整数等,而可变对象最典型的有列表。
- 可迭代对象。
- 变量名。变量名指向一个内存地址(指向一个对象),函数内可以使用全局变量,若指向的是可变对象,则可以在原内存地址中修改,但是永远无法改变该变量指向其他地址。如果需要修改该变量指向的地址,需要声明:“global 变量名”。
- 变量的引用,引用的内存空间是哪里取决于右端值返回的是副本还是原地址空间。值得注意。
- 函数传参,传的永远是内存地址。这一点非常重要。
列表
numpy库
numpy库提供了多维数组的数据类型,这在处理数据时极其方便。
数组arr的索引。某种角度而言,arr的索引有两种,一种是返回arr内存地址空间的映像,这在数据量很大时是非常快的;一种是返回副本,即是复制过的,它的内存地址是不一致的。
- 返回原内存地址映像:
a
r
r
[
x
0
,
x
1
,
.
.
.
,
x
n
−
1
]
arr[x_0,x_1,...,x_{n-1}]
arr[x0,x1,...,xn−1]。这里面每一个
x
i
x_i
xi表示的是一个切片"a:b"(左闭右开[a,b))。
可以将上述情况分成三种情况:
- a r r [ a , x 2 , . . . , x n − 1 ] arr[a,x_2,...,x_{n-1}] arr[a,x2,...,xn−1]:此时,a相当于切片[a:a+1],与他不同的是用a的时候arr将降低一个维度,而用切片[a:a+1]并不会降低维度。因此需要特别留意此处!
- a r r [ a : b , x 2 , . . . , x n − 1 ] arr[a:b,x_2,...,x_{n-1}] arr[a:b,x2,...,xn−1]:这是最常规的操作,切取该维度的 [ a , b − 1 ] [a,b-1] [a,b−1]。
- a r r [ a : b ] arr[a:b] arr[a:b]:后续没有指明的维度,默认为全选:。
- 返回数组的副本:
a
r
r
[
x
0
,
x
1
,
.
.
.
,
x
n
−
1
]
arr[x_0,x_1,...,x_{n-1}]
arr[x0,x1,...,xn−1]。这里面每一个
x
x
x表示的是一个整数列表"[a,b,c]",他返回对应排列的的数组副本。
可以将上述情况分成三种情况:
-
a r r [ x 0 , x 1 , . . . , x n − 1 ] arr[x_0,x_1,...,x_{n-1}] arr[x0,x1,...,xn−1],返回对应索引的值副本,他是一个行向量,可以利用它来有效赋值!
-
a r r [ x 0 ] arr[x_0] arr[x0] ,只有一个 x 0 x_0 x0,即 a r r [ x 0 ] arr[x_0] arr[x0],未指明的默认该维度全选(相当于现实的":" ),因此返回数组对应维度对应排列的副本,这就是所谓的花式索引,在选取一些特定行(特定样本)时非常方便。
-
a r r [ x ] arr[x] arr[x],此时x为一个布尔型的对应数组,他返回对应值,可以利用他进行有效的赋值。
数组的类型:
- dtype。通过arr.dtype可以查看当前数组的类型。数组是单一类型的,如果对一个整数数组的某个空间赋值为浮点数,则只截取整数部分。利用arr.dtype = np.float64 可以解释为64位浮点数,此时信息并没有变化,只是它的解释方式变了。
- 如果想要就爱哪个某个数组转化为另一中数据类型,此时可能造成信息的损失,可以用as.type。如arr2 = arr1.astype(np.int32)。
注:数组的不同数据类型可能会导致运算规则的变化,这是可能带来很大的迷惑。特别是在赋值运算时会引起类型的变化,需要特别注意,例如图像处理时,图片数组的类型是uint8,此时如果不注意进行赋值,就会因为截断而产生很多不容易发现的错误。
# e.g. 1
>>> o
array([1, 1, 1, 1], dtype=uint8)
>>> k
array([248, 248, 248, 1], dtype=uint8)
>>> o-k
array([9, 9, 9, 0], dtype=uint8)
# e.g. 2
>>> k
array([248, 248, 248, 1], dtype=uint8)
>>> k*k
array([64, 64, 64, 1], dtype=uint8)
数组的一些有用的函数:(矢量化计算,速度块,基于np库)
4. dot 、 T 、inv 、 np.sqrt 、 np.exp、 np.log
5. np.sum(arr, axis)、 np.max(arr, axis)、 np.argmax(arr, axis),这些函数可以对数组进行快捷操作,其中axis默认为none,表示的将其压平为行向量操作,如果指明维度为m,则沿着该维度进行操作。返回的均是一个行向量(一维)。因此需要注意其维度变化。可以利用reshape进行重塑。
6. reshape(arr,newshape),利用此函数可以有效的塑造所要的数组维度。e.g. reshape(np.arange(6),(2,3))
7. 格式化输出 "{0:*[<^>]n} … ".format{“str0”,“str1”,“str2”}
8. np.argwhere(condition)、np.where
9. 对bool值矩阵,利用arr.any()和arr.all()来做逻辑判断
10. 对数据进行加行和加列。np.hstack ,其中h表示horizontally。
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.hstack((a,b))
array([1, 2, 3, 2, 3, 4])
>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.hstack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])