numpy.array的学习笔记

import numpy as np
a = 1
a

1

for i in range(0,10):
    print(i)
0
1
2
3
4
5
6
7
8
9

b = 10
a + b

11

for i in range(10):
    print(i)
0
1
2
3
4
5
6
7
8
9

data = [i * 2 in range(100)]
for item in data:
    print(item)
True

%run

可以执行指定的脚本

%timeit

%timeit items = [i**2 for i in range(1000000)]
291 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit items = [i**2 for i in range(1000)]
244 µs ± 7.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit items = [i**2 for i in range(10)]
2.47 µs ± 44.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
L = []
for i in range(10000):
    L.append(i)
634 µs ± 26.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

这里可以获得到执行这一段的大概需要的时间

会根据这一句话的时间复杂度来改变loop的次数

生成表达式会快一些的

%time

%time items = [i**2 for i in range(3500000)]
Wall time: 1.02 s

可以使用%time不取多次,但是不稳定

果然比C++慢太多,3500000就基本上超时了

import numpy as np
np.__version__  #numpy版本显示

'1.19.2'

03.python3 numpy.array基础

# python原版创建数组的方式
L = [i for i in range(100)]  # 这种的效率会比较低
# 利用array的方式来创建
import array
arr = array.array('i', [i for i in range(10)]);
arr

array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arr[5]

5

#arr[2] = "Aed"
#这样就会报错了,array类型是限定的类型
#相对的效率会比较高
#没有配置矩阵相对应的算法封装

使用numpy.array创建

# 利用python中的array库写出来的
nparr = np.array([0,1,2,3,4,5,6,7,8,9])
nparr[5]

5

nparr[5] = 100
nparr[5]

100

#nparr[5] = "awd"
#这样是报错的,强类型
nparr.dtype

dtype('int32')

nparr[5] = 123.123
nparr[5]

123

nparr = np.array([1, 2, 3.5])
nparr.dtype   #初始的时候会确定类型

dtype('float64')

其他numpy.array中创建数组矩阵的方法

np.zeros(10)

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

np.zeros(10).dtype

dtype('float64')

np.zeros(10, dtype = int)   # 可以设置类型

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

#还可以指定形状
#可以传入元组
np.zeros((3, 5))

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

np.zeros(shape = (5, 5), dtype = float)

array([[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.]])

#全1矩阵
np.ones(shape = (3, 5), dtype = int)

array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]])

创建一个由任意数字组成的矩阵

np.full((3, 3), 666)

array([[666, 666, 666],
       [666, 666, 666],
       [666, 666, 666]])

np.full(shape = (5, 5), fill_value = 555)

array([[555, 555, 555, 555, 555],
       [555, 555, 555, 555, 555],
       [555, 555, 555, 555, 555],
       [555, 555, 555, 555, 555],
       [555, 555, 555, 555, 555]])

arange

[i for i in range(0, 20, 2)]   #原生pythonrange

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

np.arange(0, 20, 0.2)     #这里是可以传入浮点数的,而上边的不可以的

array([ 0. ,  0.2,  0.4,  0.6,  0.8,  1. ,  1.2,  1.4,  1.6,  1.8,  2. ,
        2.2,  2.4,  2.6,  2.8,  3. ,  3.2,  3.4,  3.6,  3.8,  4. ,  4.2,
        4.4,  4.6,  4.8,  5. ,  5.2,  5.4,  5.6,  5.8,  6. ,  6.2,  6.4,
        6.6,  6.8,  7. ,  7.2,  7.4,  7.6,  7.8,  8. ,  8.2,  8.4,  8.6,
        8.8,  9. ,  9.2,  9.4,  9.6,  9.8, 10. , 10.2, 10.4, 10.6, 10.8,
       11. , 11.2, 11.4, 11.6, 11.8, 12. , 12.2, 12.4, 12.6, 12.8, 13. ,
       13.2, 13.4, 13.6, 13.8, 14. , 14.2, 14.4, 14.6, 14.8, 15. , 15.2,
       15.4, 15.6, 15.8, 16. , 16.2, 16.4, 16.6, 16.8, 17. , 17.2, 17.4,
       17.6, 17.8, 18. , 18.2, 18.4, 18.6, 18.8, 19. , 19.2, 19.4, 19.6,
       19.8])

np.arange(0, 20)      #默认的步长为1
np.arange(20)      #默认的起始点为0

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])

linspace

np.linspace(0, 20, 10)    #等长的截取十个点(是包括前后两个边界的)

array([ 0.        ,  2.22222222,  4.44444444,  6.66666667,  8.88888889,
       11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.        ])

random

np.random.randint(0, 10)     #取一个从0到10(不取到10)的随机数

7

np.random.randint(0, 10, 10)    #这里是从0到10随机取出来10个数(但是不会取到10)

array([5, 6, 4, 7, 4, 8, 3, 9, 8, 0])

#用这个案例来验证
np.random.randint(0, 1, 10)   #这里就只能取到0了

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.random.randint(4, 8, size = 10)    #最好还是标一下最后的size

array([5, 4, 5, 7, 4, 5, 4, 7, 7, 5])

#size还可以是一个元组,酒可以得到一个矩阵
np.random.randint(0, 10, size=(3,5))   #这样就可以得到一个3,5的随机数矩阵

array([[9, 4, 5, 5, 3],
       [7, 3, 3, 6, 8],
       [0, 9, 7, 0, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

np.random.seed(666)
np.random.randint(0, 10, size=(3,5))

array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])

#可以看到只要随机种子他是一样的,生成的矩阵就是相同的
np.random.random()   #默认情况下是随机生成一个0~1的随机数(浮点数)

0.7315955468480113

np.random.random((3, 5))

array([[0.8578588 , 0.76741234, 0.95323137, 0.29097383, 0.84778197],
       [0.3497619 , 0.92389692, 0.29489453, 0.52438061, 0.94253896],
       [0.07473949, 0.27646251, 0.4675855 , 0.31581532, 0.39016259]])

#这里是一个均匀分布的随机数
np.random.random(10)

array([0.26832981, 0.75366384, 0.66673747, 0.87287954, 0.52109719,
       0.75020425, 0.32940234, 0.29130197, 0.00103619, 0.6361797 ])

np.random.normal()    #这样生成的随机数就符合均值为0,方差为1的分布

-1.5644858645303779

np.random.normal(10, 100)  #这里均值为10,方差为100的随机数,高斯分布

-152.8790044148518

np.random.normal(0, 1, (3, 5))  #这样就是生成一个正态分布的随机数矩阵

array([[ 1.23174866, -0.91360034, -0.27084407,  1.42024914, -0.98226439],
       [ 0.80976498,  1.85205227,  1.67819021, -0.98076924,  0.47031082],
       [ 0.18226991, -0.84388249,  0.20996833,  0.22958666,  0.26307642]])

np.random.normal?     #这样可以查询文档的
  File "<ipython-input-63-1f081c35fe4f>", line 1
    np.random.normal?     #这样可以查询文档的
                    ^
SyntaxError: invalid syntax

help(np.random.normal)    #这样就不用新开窗口了

numpy.array的一些基本操作

import numpy as np
x = np.arange(10)
x
X = np.arange(15).reshape(3, 5)
X

numpy.array数组的基本属性

x.ndim    #可以得到x矩阵的维数
X.ndim
x.shape    #返回的是一个元组
X.shape     #返回的是一个两维的元组
x.size    #获得大小
X.size    #获得大小

numpy.array的数据的访问

X
x[1]
X[1]
X[1][1]    #这样是不建议是这么访问的
#可以倒序查询   比如倒数第一个元素
x[-1]
X[(0, 0)]   #建议里边加一个元组
X[0, 0]    #当然建议这样写
x[0: 5]    #切片简介
x[:5]     #这样就是从第一个开始读取
x[5:]       #这样就是从索引值为5的位置开始一直读取到最后一位
x[::2]      #第三个参数为步长
x[::-1]     #当然也是可以倒序查询的
X         #numpy也可以轻松的访问到多维数组的元素
X[:2, :3]       #前两行的前三列,组合切片
X[:2][:3]    
X[:2]    #然后取前三行
#即使在访问单一元素多使用逗号的方式来访问
X[::-1, ::-1]     #倒序查询
X[0, :]    #这样就是取到整个第0行
#变成了一个向量
X[0, :].ndim
subX = X[:2, :3]      #这里其实没有创建了一个全新的矩阵,这里是引用的方式来获取到了子矩阵
subX           #修改子矩阵会修改原矩阵,优先考虑效率
subX[1, 2] = 100
subX
X     #这里就变了
#要想获得单独的全新的矩阵,调用copy函数
subX2 = X[:2, :3].copy()
subX2
subX2[0, 0] = 1000
subX2
X      #这里就没有变化了

reshape

#可以改变维度
x
x.shape
x.ndim
x.reshape(2, 5)     #根据x改变一下维度
A = x.reshape(2, 5)
A
B = x.reshape(10, -1)     #-1就代表自动改变
B        #得到了10行的矩阵
x.reshape(2, -1)
#x.reshape(3, -1)   #这样是不行的

合并与分割的操作

x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
x
y
np.concatenate([x, y])     #这样可以得到一个合成的 
z = np.array([666, 666, 666])
np.concatenate([x, y, z])
A = np.array([[1, 2, 3],
            [4, 5, 6]])
B = np.zeros((3, 3))
A
B
np.concatenate([A, A])
np.concatenate([A, B])
C = np.zeros((2, 6))
C
#np.concatenate(A, C)
#这样是会报错的
#矩阵的合并我们需要列数是相等的
#行数是代表着样本的数量
#列数是代表着特征的数量
#因为合并矩阵目的是要去合并样本,而不是合并他们的特征
#默认是合并列
#但是我们也可以修改的
np.concatenate([A, A], axis = 1)   #这样就是沿着第二个维度来合并了
#也就是沿着列来合并
np.concatenate([A, A], axis = 0)     #默认是第0个维度
#np.concatenate([A, z])    #这里z是一维的向量
​
#这里我们这个函数是不能将低维的向量合并到高维的矩阵当中的
​
#这样会报错的
np.concatenate([A,[z]])    #自己想的,加一个中括号升维
np.concatenate([A, z.reshape(1, -1)])
#当然还有一个更加简便的方式
np.vstack([A, z])   #容错性很好,自动的叠加
B = np.full((2, 2), fill_value = 666)
B
np.hstack([A, B])
a = 1

分割操作

x = np.arange(10)
x

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.split(x, (3, 7))     #分割对象,分割点(列表指定多个分割点)

[array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]

#这里就将对象x分割成了3个部分
[x1,x2,x3] = np.split(x, (3, 7))
x1

array([0, 1, 2])

x2

array([3, 4, 5, 6])

x3

array([7, 8, 9])

np.split(x, [1])     #传入的是列表不能是元组

[array([0]), array([1, 2, 3, 4, 5, 6, 7, 8, 9])]

A = np.arange(16).reshape((4, 4))
A

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

[A1, A2] = np.split(A, [2], axis = 1)
A1

array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])

A2

array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])

upper, lower = np.split(A, [2], axis = 0)
upper

array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

lower

array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])

left, right = np.hsplit(A, [2])
left

array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]])

right

array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])

#数据分割的意义

numpy.array中的运算

给定的一个向量,让向量中的每一个数乘以2

a = (0, 1, 2)

b = (0, 2, 4)

n = 10
L = [i for i in range(n)]
L

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2 * L

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

A = []
for i in L:
    A.append(i * 2)
A
​

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

n = 100000
L = [i for i in range(n)]
%%timeit
A = []
for i in L:
    A.append(i * 2)
58.2 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
A = [2 * e for e in L]
42.7 ms ± 8.67 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

L = np.arange(n)
%%timeit
A = np.array(2 * e for e in L)
1.63 µs ± 55.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

L

array([    0,     1,     2, ..., 99997, 99998, 99999])

test = np.arange(1, 10)
test

array([1, 2, 3, 4, 5, 6, 7, 8, 9])

test = test.reshape((3, 3))
test

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

np.exp(test)

array([[2.71828183e+00, 7.38905610e+00, 2.00855369e+01],
       [5.45981500e+01, 1.48413159e+02, 4.03428793e+02],
       [1.09663316e+03, 2.98095799e+03, 8.10308393e+03]])

np.log(test)

array([[0.        , 0.69314718, 1.09861229],
       [1.38629436, 1.60943791, 1.79175947],
       [1.94591015, 2.07944154, 2.19722458]])

矩阵运算

A = np.arange(4).reshape(2, 2)
A

array([[0, 1],
       [2, 3]])

B = np.full((2, 2), fill_value = 10)
B

array([[10, 10],
       [10, 10]])

A + B

array([[10, 11],
       [12, 13]])

A * B       #这样子得到的不是A和B矩阵的矩阵相乘法

array([[ 0, 10],
       [20, 30]])

A - B

array([[-10,  -9],
       [ -8,  -7]])

A.dot(B)      #这样就是代表了A矩阵乘以B矩阵

array([[10, 10],
       [50, 50]])

A.T        #这样是求A矩阵的转置矩阵

array([[0, 2],
       [1, 3]])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值