Python学习笔记-数据分析-Numpy01-基础数据结构

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://blog.csdn.net/MicroWisdom/article/details/83050893

Numpy是Python开源的科学计算工具包,主要的特点如下:

  • 强大的N维数组对象:ndarray
  • 对数组结构数据进行运算(不用遍历循环)
  • 随机数、线性代数、傅立叶变换等多种功能
说明:
1、本人的笔记均在win10(64)环境下的Jupyter- Notebook中直接编写,如有需要可以直接拷贝代码。
2、注释中除了有关于代码的解释,还有本人在学习中的一些拙见。
3、本人代码注释均写在代码上方。

一、 Numpy数组ndarray

# 注意与list打印出来的区别,list用逗号分隔元素。array没有分隔。

# 引入numpy这个包,并改名为np
import numpy as np

# 用.array创建np的数组,类型是numpy.ndarray
# .array()是个方法,所以后面的小括号是必须的。
# 小括号里是要生成的数组的内容,可以用小括号()也可以用中括号[]
ar = np.array((1,2,3,4,5))
ar1 = np.array([1,2,3,4,5])
print(ar, type(ar))
print(ar1,type(ar1))

运行结果如下:

[1 2 3 4 5] <class 'numpy.ndarray'>
[1 2 3 4 5] <class 'numpy.ndarray'>
# 二三维数组
# 二维数组是由两个一维数组组成的。
# 三维数组是由两个二维数组组成的。
# 刚开始可能对各种括号有些乱,我是这样区分的。
# 以[[1,2,3,4,5,],[6,7,8,9,10]]为例子:
# 最外层[]跟一维数组的理解一样;内层[1,2,3,4,5,]是第一个一维数组;内层[6,7,8,9,10]是第二个一维数组
# 中间的,号是区分这两个数组
ar2 = np.array([[1,2,3,4,5,],[6,7,8,9,10]])
ar3 = np.array(([1,2,3,4,5],[6,7,8,9,10]))
print(ar2)
print('----------------------------')
print(ar3)
print('----------------------------')

运行结果如下:

[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
# 三维数组
# 注意,由于元素中有字符,所以整个数组的元素都会变成字符。
ar4 = np.array([[(['a','b','c','d','e'],[1,2,3,4,5])],[(['a','b','c','d','e'],[6,7,8,9,10])]])
print(ar4,type(ar4))在这里插入代码片

运行结果如下:

[[[['a' 'b' 'c' 'd' 'e']
   ['1' '2' '3' '4' '5']]]

 [[['a' 'b' 'c' 'd' 'e']
   ['6' '7' '8' '9' '10']]]] <class 'numpy.ndarray'>

二、数组生成

1、range()和arange()

# 对于array生成数组的说明,.array()括号里可以是列表、元祖、数组、生成器等等
# 通过range()生成一个0-9的list,并通过array转换成数组。
ar_r = np.array(range(10))
print(ar_r,type(ar_r))
# 通过Numpy自己的arange直接生成数组。
ar_ar = np.arange(10)
print(ar_ar,type(ar_ar))

# 如果arange()括号里面的数带小数点的话,例如5.0就变成浮点型了。
ar_r1 = np.arange(5.0)
print(ar_r1,type(ar_r1))
# 跟range()一样,可以通过最后一个参数来控制步长。
print(np.arange(0,10,2))

运行结果如下:

[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
[0. 1. 2. 3. 4.] <class 'numpy.ndarray'>
[0 2 4 6 8]
# 通过列表直接生成数组时,前后两个列表如果元素个数不同的话,会导致的整个数组维度变化。
ar5 = np.array([[1,2,3,4,5,],[6,7,8,9,10,'a','b']])
ar5_1 = np.array([[1,2,3,4,5,],[6,7,8,9,10,]])
print('这是ar5:',ar5)
print('----------------------------')
print('这是ar5_1:',ar5_1)
print('----------------------------')
print('注意数组维度--->',ar5.ndim)
print('注意数组维度--->',ar5_1.ndim)

运行结果如下:

这是ar5: [list([1, 2, 3, 4, 5]) list([6, 7, 8, 9, 10, 'a', 'b'])]
----------------------------
这是ar5_1: [[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
----------------------------
注意数组维度---> 1
注意数组维度---> 2

2、.linspace()

# .linspace()有五个常用参数(开始,结束,个数,是否包含最后一个数,显示步长),如果最后一个参数不指定就包括“开始”和“结束”这两个值。
# 注意
# 1、由于包括开始和结束,所以在进行间隔分段的时候经常出现带小数的,而且小数的位数很多。
# 2、想避开很多小数位的话,可以调整分隔数
# 3、如果步长参数retstep = True的话,那么生成的就是元祖了。

# 从1开始到15,共分12份
print(np.linspace(1,15,num = 12))
print('-----------------------------')

# 从1开始到15,共分11份
print(np.linspace(1,15,num = 11))
print('-----------------------------')

# 从1开始到15,共分10份,但不包含最后一个数15 retstep
print(np.linspace(1,15,num = 10,endpoint = False))
print('-----------------------------')

#从1开始到15,共分10份,显示步长
s = np.linspace(1,15,num = 10,retstep = True)
print(s)
print('注意是元祖--->',type(s))
print('-----------------------------')

# 通过下标访问的话,第一个是数组本身,第二个是步长
print('数组-->',s[0])
print('-----------------------------')
print('步长-->',s[1])

运行结果如下:

[ 1.          2.27272727  3.54545455  4.81818182  6.09090909  7.36363636
  8.63636364  9.90909091 11.18181818 12.45454545 13.72727273 15.        ]
-----------------------------
[ 1.   2.4  3.8  5.2  6.6  8.   9.4 10.8 12.2 13.6 15. ]
-----------------------------
[ 1.   2.4  3.8  5.2  6.6  8.   9.4 10.8 12.2 13.6]
-----------------------------
(array([ 1.        ,  2.55555556,  4.11111111,  5.66666667,  7.22222222,
        8.77777778, 10.33333333, 11.88888889, 13.44444444, 15.        ]), 1.5555555555555556)
注意是元祖---> <class 'tuple'>
-----------------------------
数组--> [ 1.          2.55555556  4.11111111  5.66666667  7.22222222  8.77777778
 10.33333333 11.88888889 13.44444444 15.        ]
-----------------------------
步长--> 1.5555555555555556

3、zeros()和ones()

# .zeros()生成元素全部为0的数组,zeros(shape, dtype=float, order='C')
# .ones()生成元素全部为1的数组,ones(shape, dtype=None, order='C')

# 生成10个元素为0的数组
print('10个元素为0的数组:','\n',np.zeros(10))
# 生成10个元素为1的数组
print('10个元素为1的数组:','\n',np.ones(10))

# 生成2行5列的二维全0数组
# 注意括号里的写发,参数第一个是shape也就是形状,
print('2行5列二维数组--->','\n',np.zeros((2,5)))
print('3行5列二维数组--->','\n',np.zeros((3,5)))

s1 = np.zeros((2,3,5))
print('三维数组--->','\n',s1)
print('几维数组??-->',s1.ndim)
# ones()同样是
print('2行5列二维数组--->','\n',np.ones((2,5)))
print('3行5列二维数组--->','\n',np.ones((3,5)))
s2 = np.ones((2,3,5))
print('三维数组--->','\n',s2)
print('几维数组??-->',s2.ndim)

运行结果如下:

10个元素为0的数组: 
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
10个元素为1的数组: 
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
2行5列二维数组---> 
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
3行5列二维数组---> 
 [[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
三维数组---> 
 [[[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]

 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]]
几维数组??--> 3
2行5列二维数组---> 
 [[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
3行5列二维数组---> 
 [[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
三维数组---> 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]
几维数组??--> 3

4、zeros_like()、/ones_like()和eye()

# .zeros_like()生成一个和参数形状相同的全0数组。
# .ones_like()生成一个和参数形状相同的全1数组。
print('前面定义的一个二维数组:','\n',ar2)
print('生成一个和ar2形状相同的全0数组:','\n',np.zeros_like(ar2))
print('生成一个和ar2形状相同的全1数组:','\n',np.ones_like(ar2))


# eye()生成一个正方的N×N的矩阵数组,其中对角线值为1,其他的为0
print('生成一个4×4的矩阵:','\n',np.eye(4))

运行结果如下:

前面定义的一个二维数组: 
 [[ 1  2  3  4  5]
 [ 6  7  8  9 10]]
生成一个和ar2形状相同的全0数组: 
 [[0 0 0 0 0]
 [0 0 0 0 0]]
生成一个和ar2形状相同的全1数组: 
 [[1 1 1 1 1]
 [1 1 1 1 1]]
生成一个4×4的矩阵: 
 [[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

5、ndim()和shape()

# ndarray.ndim 查看数组的维度,也就是看是几维数组
# 查看之前定义的ar、ar2和ar4是几维数组
print('ar的维度',ar.ndim)
print('ar2的维度',ar2.ndim)
print('ar4的维度',ar4.ndim)

# ndarray.shape 查看数组的形状或者说是尺寸,就是几行几列 如n行m列(n,m)

# ar是0行列5列

print(ar.shape)
print('-----------------------------')
# ar2是2行5列
print(ar2.shape)
print('-----------------------------')

# 看一个特别的例子
ar6 = np.array([[1],[2]])
print(ar6,'\n',ar6.shape)

运行结果如下:

ar的维度 1
ar2的维度 2
ar4的维度 4
(5,)
-----------------------------
(2, 5)
-----------------------------
[[1]
 [2]] 
 (2, 1)

6、size()、dtype()、itemsize()和data()

# ndarray.size 查看数组中元素的总个数
print(ar.size)
print('-----------------------------')
print(ar2.size)
print('-----------------------------')
print(ar4.size)
print('-----------------------------')

运行结果如下:

5
-----------------------------
10
-----------------------------
20
-----------------------------
# ndarray.dtype 查看数组中元素的类型。
# 另外NumPy提供它自己的类型。numpy.int32,numpy.int16和numpy.float64是一些例子。
# 注意与.type的区别

print(type(ar2),'\n',ar2.dtype)

运行结果如下:

<class 'numpy.ndarray'> 
 int32
# ndarray.itemsize 查看数组中每个元素的字节大小
print(ar2.itemsize)

运行结果如下:

4
# ndarray.data 查看数组中元素的缓冲区。
# 一般很少会用到这个,用的比较多的是用索引来范围各个元素。
print(ar3.data)

运行结果如下:

<memory at 0x000002782F10F1F8>

猜你喜欢

转载自blog.csdn.net/MicroWisdom/article/details/83050893