【自学】利用python进行数据分析 LESSON1 <Numpy基础——Numpy ndarray:多维数组对象1>


前言

Numpy的核心特征之一就是N-维数组对象。


一、生成ndarray

1. array函数

创建数组的方式有很多,第一种是使用array 

import numpy as np

data1 = [[1, 2, 3], [5 ,6 ,7]]
arr1 = np.array(data1)

print(f'arr1 is {arr1}')
print(f'shape is {arr1.shape}')

结果:

arr1 is [[1 2 3]
 [5 6 7]]
shape is (2, 3)

 2. zeros或empty

代码:

import numpy as np

data1 = np.zeros(10)
print(f'data1 is {data1}')

data2 = np.zeros((3, 6))
print(f'data2 is {data2}')

data3 = np.empty(((2, 3, 2)))
print(f'data3 is {data3}')

结果:

data1 is [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
data2 is [[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]
data3 is [[[6.23042070e-307 1.89146896e-307]
  [3.44897822e-307 1.33511290e-306]
  [3.11525958e-307 3.33774660e-307]]

 [[8.01097889e-307 1.24611538e-306]
  [1.60221072e-306 6.89804132e-307]
  [1.11261162e-306 8.34443015e-308]]]

由此可见,用np.empty来生成全0数组并不可靠。

3. arange

代码:

import numpy as np

data1 = np.arange(15)
print(f'data1 is {data1}')

data2 = range(0, 15)
print(data2)

结果:

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

由此可见,不可以用range函数生成数组

4. 其他

代码: 

import numpy as np

#生成一个0-14的一维数组
data1 = np.arange(15)
print(f'data1 is {data1}')
data_1 = np.arange(2, 10)
print(data_1)
data_2 = np.arange(2, 10, 3)
print(data_2)


#生成和data1形状相同的全是0的数组
data2 = np.zeros_like(data1)
print(f'data2 is {data2}')


#生成全是1的数组
data3 = np.ones(15)
print(f'data3 is {data3}')
data_3 = np.ones((2, 4))
print(f'data_3 is {data_3}')


#根据给定的形状和数据类型生成指定数值的数组
data4 = np.full((2, 3), 5) 
print(f'data4 is {data4}')

结果:

data1 is [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[2 3 4 5 6 7 8 9]
[2 5 8]
data2 is [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
data3 is [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
data_3 is [[1. 1. 1. 1.]
 [1. 1. 1. 1.]]
data4 is [[5 5 5]
 [5 5 5]]

二、Numpy数组算术

加减乘除是比较简单的,不再赘述。

同尺寸数组之间的比较,会生成一个布尔值数组

代码:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

arr1 = arr ** 2
print(f'arr1 is {arr1}')

arr2 = arr ** 0.5
print(f'arr2 is {arr2}')

brr = np.array([[0, 4, 1], [7, 2, 12]])
brr1 = brr > arr
print(brr1)

结果:

arr1 is [[ 1  4  9]
 [16 25 36]]
arr2 is [[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]]
[[False  True False]
 [ True False  True]]

在进行不同尺寸数组间的操作时,会用到广播特性。后续进行介绍。


三、基础索引与切片

1. 一维数组 

import numpy as np

arr = np.arange(15)
print('arr')
print(arr)

arr1 = arr[4]
print('arr1')
print(arr1)

arr2 = arr[2:10]
print('arr2')
print(arr2)

arr[3:9] = 1000
print('new arr')
print(arr)

arr[:] = 20
print('arr')
print(arr)

arr[2:] = 0
print(arr)

arr[:3] = 1
print(arr)

结果:

arr
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
arr1
4
arr2
[2 3 4 5 6 7 8 9]
new arr
[   0    1    2 1000 1000 1000 1000 1000 1000    9   10   11   12   13
   14]
arr
[20 20 20 20 20 20 20 20 20 20 20 20 20 20 20]
[20 20  0  0  0  0  0  0  0  0  0  0  0  0  0]
[1 1 1 0 0 0 0 0 0 0 0 0 0 0 0]

2. 多维数组

(1)索引

对于对为数组,每个索引值对应的不是一个值,而是一个数组。

代码: 

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
print(arr[2])
print(arr[2][0])
print(arr[2, 0])
#由此可见,arr[2][0]与arr[2, 0]是等效的

结果:

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

(2)切片

代码:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)

'进行单组切片'
print()
print(arr[:2]) #取前两行
print(arr[2:]) #从第2行开始取,一直取到最后

'进行多组切片'
print()
print(arr[:2, 1:])

结果:

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

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

[[2 3]
 [5 6]]

(3)索引与切片混合

代码:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)


'索引与切片混合'
print()
print(arr[1, :2])
print()
print(arr[:2, 2])

结果:

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

[4 5]

[3 6]

注意:单独一个冒号表示选择整个轴上的数组

代码:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)


'索引与切片混合'
print()
print(arr[:, :1])
print()
print(arr[:, :2])
print()
print(arr[1:, 2])

结果:

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

[[1]
 [4]
 [7]]

[[1 2]
 [4 5]
 [7 8]]

[6 9]

总结

目前来看这本书比较简单,这个系列希望可以在文章中多一些例子和练习,以便更容易理解、印象更加深刻。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rachel MuZy

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值