python学习之Numpy库的使用

使用前提要在pycharm中导入Numpy库

import numpy as np
from datetime import datetime
from random import *

def pythonsum(n):
    a = list(range(n))  # Python3中的range不返回一个数组对象,而是返回一个range对象
    b = list(range(n))
    c = []
    for i in range(len(a)):
        a[i] = i**2
        b[i] = i**3
        c.append(a[i]+b[i])
    return c
print(pythonsum(5))

def numpysum(n):
    a = np.arange(n)**2
    b = np.arange(n)**3
    c = a + b
    return c
print(numpysum(5))

size=1000
start = datetime.now()
time = numpysum(size)
data = datetime.now()-start
print("numpy所用的时间是:",data.microseconds)

start = datetime.now()
time = pythonsum(size)
data = datetime.now()-start
print("python所用的时间是:",data.microseconds)
输出结果:
[0, 2, 12, 36, 80]
[ 0  2 12 36 80]
numpy所用的时间是: 0
python所用的时间是: 1999

a = np.arange(5)
print(a.dtype)  # 查看arange数组的类型
print(a.shape)  # 查看数组每一维的长度
输出结果:
int32
(5,)

# 创建多维数组
m = np.array([np.arange(2),np.arange(2)])  # 创建2*2的数组
print(m,m.shape,m.dtype)
输出结果:
[[0 1]
 [0 1]] (2, 2) int32
说明这是一个2*2的数组,数组中每一个元素的类型是int32,32是整形的长度

# 创建特殊数组
print(np.zeros(10))  # 创建全0数组
print(np.zeros((3,6)))  # 创建3行6列全0数组
print(np.empty((2,3,2)))  # 创建2*3*2的数组,数组里两个子数组,每个子数组三行两列 只分配内存空间
print(np.arange(15))  # 创建长度为15的数组
print(np.eye(3,3))   # 生成对角线是1的3*3的矩阵
输出结果:
[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.]]
[[[9.40636937e-306 9.37247176e-306]
  [9.36595299e-306 9.37520965e-306]
  [9.37599190e-306 9.38238030e-306]]

 [[9.36699600e-306 9.39750385e-306]
  [9.37260214e-306 9.45182694e-306]
  [9.38537893e-306 9.44948018e-306]]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

# 选取数组中的元素
a = np.array([[1,2],[3,4]])  # 创建一个数组
print(a)
print(a[0,0],a[0,1])  # 选取数组元素
输出结果:
[[1 2]
 [3 4]]
1 2

# 数组与标量之间的运算
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
print(arr)
print(arr*arr)
print(arr-arr)
print(1/arr,arr**0.5)
输出结果:
[[1. 2. 3.]
 [4. 5. 6.]]
[[ 1.  4.  9.]
 [16. 25. 36.]]
[[0. 0. 0.]
 [0. 0. 0.]]
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]] 
[[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]]


# 数组的索引与切片
a = np.arange(9)
print(a[3:7])  # 获取数组中指定位置元素
print(a[:7:2])  # 从0开始到7 以2为不长
print(a[::-1])  # 进行反转
输出结果:
[3 4 5 6]
[0 2 4 6]
[8 7 6 5 4 3 2 1 0]

b = np.arange(24).reshape(2,3,4)  # 改变数组的维度
print(b)
print(b[0,0,0])
print(b[:,0,0])
print(b[0])
print(b[0,1])  # 指定打印行
print(b[0,:,1])  # 指定打印列
输出结果:
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
0
[ 0 12]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[4 5 6 7]
[1 5 9]

# 布尔类型的索引
names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4)
print(names)
print(data)
print(data[names == 'Bob'])  # names和data里是对应关系,输出行
print("============================")
输出结果:
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[-1.06497531 -0.67700958  0.00801293 -2.53275686]
 [ 0.18395101 -1.53590547 -0.27898633 -0.61355599]
 [-0.97534594 -0.00714428 -0.5272347   1.63341211]
 [ 0.08481862  0.75813306  0.60190216 -0.02815623]
 [-0.13470018 -0.59937593 -1.22813608  1.26896538]
 [-2.37586693  0.04865015 -0.03679881  0.37807461]
 [-0.31245456  1.49157519  0.35272635 -2.01963631]]
[[-1.06497531 -0.67700958  0.00801293 -2.53275686]
 [ 0.08481862  0.75813306  0.60190216 -0.02815623]]
============================


#  花式索引
arr = np.empty((8,4))
for i in range(8):
    arr[i]=i
print(arr)
print(arr[[4,3,0,6]])  # 输出下标是4,3,0,6的行
输出结果:
[[0. 0. 0. 0.]
 [1. 1. 1. 1.]
 [2. 2. 2. 2.]
 [3. 3. 3. 3.]
 [4. 4. 4. 4.]
 [5. 5. 5. 5.]
 [6. 6. 6. 6.]
 [7. 7. 7. 7.]]
[[4. 4. 4. 4.]
 [3. 3. 3. 3.]
 [0. 0. 0. 0.]
 [6. 6. 6. 6.]]

arr = np.arange(32).reshape((8,4))
print(arr)
print(arr[[1,2,7],[0,1,3]])  # 输出指定的行列
print(arr.T)  # 对矩阵进行转置
输出结果:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
[ 4  9 31]
[[ 0  4  8 12 16 20 24 28]
 [ 1  5  9 13 17 21 25 29]
 [ 2  6 10 14 18 22 26 30]
 [ 3  7 11 15 19 23 27 31]]

# 数组的组合
a = np.arange(9).reshape(3,3)
print(a)
b=a*2
print(b)
print(np.hstack((a,b)))  # 水平组合
print(np.vstack((a,b)))  # 垂直组合
print(np.dstack((a,b)))  # 深度组合
输出结果:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
[[[ 0  0]
  [ 1  2]
  [ 2  4]]

 [[ 3  6]
  [ 4  8]
  [ 5 10]]

 [[ 6 12]
  [ 7 14]
  [ 8 16]]]


one = np.arange(2)
twice = one*2
print(np.column_stack((one,twice)))  # 将数组进行列组合,把每一列组合起来变成新数组的行,相当于二位数组的水平组合
print(np.row_stack((one,twice)))  # 将数组进行行组合,把每一列组合起来变成新数组的列,相当于二位数组的垂直组合
输出结果:
[[0 0]
 [1 2]]
[[0 1]
 [0 2]]

# 数组的分割
a = np.arange(9).reshape(3,3)
print(np.hsplit(a,3))  # 把数组按照列来分割
print(np.vsplit(a,3))  # 把数组按照行来分割

c = np.arange(27).reshape(3,3,3)
print(np.dsplit(c,3))  # 对数组进行深度分割
输出结果:
[array([[0], [3], [6]]), 
 array([[1], [4], [7]]),
 array([[2], [5], [8]])]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
[array([[[ 0], [ 3], [ 6]], [[ 9],[12], [15]], [[18], [21],[24]]]), 
 array([[[ 1], [ 4],[ 7]],[[10],[13],[16]],[[19],[22],[25]]]),
 array([[[ 2],[ 5],[ 8]],[[11],[14],[17]],[[20],[23],[26]]])]

# 数组的属性
b = np.arange(24).reshape(2,12)
print(b.ndim)  # 输出数组的维度
print(b.size)  # 输出数组的元素个数
print(b.itemsize)  # 每个元素占的字节数
print(b.nbytes)  # 数组占的整个存储空间
输出结果:
2
24
4
96

# 数组的转换
b = np.array([1.+1.j,3.+2.j])
print(b)
print(b.tolist())  # 把数组转化成列表
print(b.tostring())  #把数组转化成字符串
print(np.fromstring('20:42:52',sep=':',dtype=int))  #把数组转化成整形
print(b.astype(int))   # 虚数转化为实数,虚部被丢弃,留下实部
print(b.astype('complex'))  # 转化为虚数

输出结果:

[1.+1.j 3.+2.j]
[(1+1j), (3+2j)]
b'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00@'
[20 42 52]
F:/语言工具/pycharm/PyCharm 2018.2.4/PyCharmWorkspace/test3/Numpy_test1.py:130: ComplexWarning: Casting complex values to real discards the imaginary part
  print(b.astype(int))   # 虚数转化为实数,虚部被丢弃,留下实部
[1 3]
[1.+1.j 3.+2.j]

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值