分享

Numpy入门教程:练习作业01

 老马的程序人生 2020-08-17

序言

什么是 NumPy 呢?

NumPy 这个词来源于两个单词 -- NumericalPython。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景:

  • 执行各种数学任务,如:数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于 Python 的 MATLAB 的快速替代。

  • 计算机中的图像表示为多维数字数组。NumPy 提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

  • 在编写机器学习算法时,需要对矩阵进行各种数值计算。如:矩阵乘法、求逆、换位、加法等。NumPy 数组用于存储训练数据和机器学习模型的参数。


练习作业

1. 创建从0到9的一维数字数组。

【知识点:数组的创建】

  • 如何创建一维数组?

【答案】

import numpy as np

arr = np.arange(10)
print(arr)
# [0 1 2 3 4 5 6 7 8 9]

2. 创建一个元素全为True的 3×3 数组。

【知识点:数组的创建】

  • 如何创建一个布尔数组?

【答案】

import numpy as np

arr = np.full([33], True, dtype=np.bool)
print(arr)
# [[ True  True  True]
#  [ True  True  True]
#  [ True  True  True]]

3. 从arr中提取所有奇数。

  • arr = np.arange(10)

【知识点:搜索】

  • 如何从一维数组中提取满足指定条件的元素?

【答案】

import numpy as np

arr = np.arange(10)

# 方法1
index = np.where(arr % 2 == 1)
print(arr[index])
# [1 3 5 7 9]

# 方法2
x = arr[arr % 2 == 1]
print(x)
# [1 3 5 7 9]

4. 将arr中的偶数元素替换为0。

  • arr = np.arange(10)

【知识点:搜索】

  • 如何用numpy数组中的另一个值替换满足条件的元素项?

【答案】

import numpy as np

arr = np.arange(10)
index = np.where(arr % 2 == 0)
arr[index] = 0
print(arr)
# [0 1 0 3 0 5 0 7 0 9]

5. 将 arr 中的所有偶数元素替换为0,而不改变arr。

  • arr = np.arange(10)

【知识点:搜索】

  • 如何在不影响原始数组的情况下替换满足条件的元素项?

【答案】

import numpy as np

arr = np.arange(10)

# 方法1
x = np.where(arr % 2 == 00, arr)
print(x)
# [0 1 0 3 0 5 0 7 0 9]
print(arr)
# [0 1 2 3 4 5 6 7 8 9]

# 方法2
x = np.copy(arr)
x[x % 2 == 0] = 0
print(x)
# [0 1 0 3 0 5 0 7 0 9]
print(arr)
# [0 1 2 3 4 5 6 7 8 9]

6. 将 arr转换为2行的2维数组。

  • arr = np.arange(10)

【知识点:数组的操作】

  • 如何改变数组的形状?

【答案】

import numpy as np

arr = np.arange(10)

# 方法1
x = np.reshape(arr, newshape=[25])
print(x)
# [[0 1 2 3 4]
#  [5 6 7 8 9]]

# 方法2
x = np.reshape(arr, newshape=[2-1])
print(x)
# [[0 1 2 3 4]
#  [5 6 7 8 9]]

7. 垂直堆叠数组a和数组b。

  • a = np.arange(10).reshape([2, -1])

  • b = np.repeat(1, 10).reshape([2, -1])

【知识点:数组操作】

  • 如何垂直叠加两个数组?

【答案】

import numpy as np

a = np.arange(10).reshape([2-1])
b = np.repeat(110).reshape([2-1])

print(a)
# [[0 1 2 3 4]
#  [5 6 7 8 9]]
print(b)
# [[1 1 1 1 1]
#  [1 1 1 1 1]]

# 方法1
print(np.concatenate([a, b], axis=0))
# [[0 1 2 3 4]
#  [5 6 7 8 9]
#  [1 1 1 1 1]
#  [1 1 1 1 1]]

# 方法2
print(np.vstack([a, b]))
# [[0 1 2 3 4]
#  [5 6 7 8 9]
#  [1 1 1 1 1]
#  [1 1 1 1 1]]

8. 将数组a与数组b水平堆叠。

  • a = np.arange(10).reshape([2, -1])

  • b = np.repeat(1, 10).reshape([2, -1])

【知识点:数组的操作】

  • 如何水平叠加两个数组?

【答案】

import numpy as np

a = np.arange(10).reshape([2-1])
b = np.repeat(110).reshape([2-1])

print(a)
# [[0 1 2 3 4]
#  [5 6 7 8 9]]
print(b)
# [[1 1 1 1 1]
#  [1 1 1 1 1]]

# 方法1
print(np.concatenate([a, b], axis=1))
# [[0 1 2 3 4 1 1 1 1 1]
#  [5 6 7 8 9 1 1 1 1 1]]

# 方法2
print(np.hstack([a, b]))
# [[0 1 2 3 4 1 1 1 1 1]
#  [5 6 7 8 9 1 1 1 1 1]]

9. 获取数组a和数组b之间的公共项。

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

  • b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])

【知识点:集合操作】

  • 如何获取两个numpy数组之间的公共项?

【答案】

import numpy as np

a = np.array([1232343456])
b = np.array([72102749498])
x = np.intersect1d(a, b)
print(x)  # [2 4]

10. 从数组a中删除数组b中的所有项。

  • a = np.array([1, 2, 3, 4, 5])

  • b = np.array([5, 6, 7, 8, 9])

【知识点:集合操作】

  • 如何从一个数组中删除存在于另一个数组中的项?

【答案】

import numpy as np

a = np.array([12345])
b = np.array([56789])
x = np.setdiff1d(a, b)
print(x)  # [1 2 3 4]

11. 获取a和b元素匹配的位置。

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

  • b = np.array([7, 2, 10, 2, 7, 4, 9, 4, 9, 8])

【知识点:逻辑函数】

  • 如何得到两个数组元素匹配的位置?

【答案】

import numpy as np

a = np.array([1232343456])
b = np.array([72102749498])
mask = np.equal(a, b)

# 方法1
x = np.where(mask)
print(x)  # (array([1, 3, 5, 7], dtype=int64),)

# 方法2
x = np.nonzero(mask)
print(x)  # (array([1, 3, 5, 7], dtype=int64),)

12. 获取5到10 之间的所有元素。

  • a = np.array([2, 6, 1, 9, 10, 3, 27])

【知识点:逻辑函数】

  • 如何从numpy数组中提取给定范围内的所有元素?

【答案】

import numpy as np

a = np.array([261910327])
mask = np.logical_and(np.greater_equal(a, 5), np.less_equal(a, 10))

# 方法1
x = np.where(mask)
print(a[x])  # [ 6  9 10]

# 方法2
x = np.nonzero(mask)
print(a[x])  # [ 6  9 10]

# 方法3
x = a[np.logical_and(a >= 5, a <= 10)]
print(x)  # [ 6  9 10]

13. 交换数组arr中的列1和列2。

  • arr = np.arange(9).reshape(3, 3)

【知识点:索引与切片】

  • 如何交换二维数组中的两列?

【答案】

import numpy as np

arr = np.arange(9).reshape(33)
print(arr)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

x = arr[:, [210]]
print(x)
# [[2 1 0]
#  [5 4 3]
#  [8 7 6]]

14. 交换数组arr中的第1行和第2行。

  • arr = np.arange(9).reshape(3, 3)

【知识点:索引与切片】

  • 如何交换二维数组中的两行?

【答案】

import numpy as np

arr = np.arange(9).reshape(33)
print(arr)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

x = arr[[102], :]
print(x)
# [[3 4 5]
#  [0 1 2]
#  [6 7 8]]

15. 反转二维数组arr的行。

  • arr = np.arange(9).reshape(3, 3)

【知识点:索引与切片】

  • 如何反转二维数组的行?

【答案】

import numpy as np

arr = np.arange(9).reshape(33)
print(arr)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

x = arr[::-1, :]
print(x)
# [[6 7 8]
#  [3 4 5]
#  [0 1 2]]

16. 反转二维数组arr的列。

  • arr = np.arange(9).reshape(3, 3)

【知识点:索引与切片】

  • 如何反转二维数组的列?

【答案】

import numpy as np

arr = np.arange(9).reshape(33)
print(arr)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

x = arr[:, ::-1]
print(x)
# [[2 1 0]
#  [5 4 3]
#  [8 7 6]]

17. 创建一个形为5×3的二维数组,以包含5到10之间的随机数。

【知识点:随机抽样】

  • 如何创建随机二维数组?

【答案】

import numpy as np

x = np.random.randint(510, [53])
print(x)
# [[5 8 8]
#  [5 6 8]
#  [8 8 7]
#  [6 7 9]
#  [6 5 8]]

x = np.random.uniform(510, [53])
print(x)
# [[6.73675226 8.50271284 9.66526032]
#  [9.42365472 7.56513263 7.86171898]
#  [9.31718935 5.71579324 9.92067933]
#  [8.90907128 8.05704153 6.0189007 ]
#  [8.70753644 7.75056151 5.71714203]]

18. 只打印或显示numpy数组rand_arr的小数点后3位。

  • rand_arr = np.random.random([5, 3])

【知识点:输入和输出】

  • 如何在numpy数组中只打印小数点后三位?

【答案】

import numpy as np

rand_arr = np.random.random([53])
print(rand_arr)
# [[0.33033427 0.05538836 0.05947305]
#  [0.36199439 0.48844555 0.26309599]
#  [0.05361816 0.71539075 0.60645637]
#  [0.95000384 0.31424729 0.41032467]
#  [0.36082793 0.50101268 0.6306832 ]]

np.set_printoptions(precision=3)
print(rand_arr)
# [[0.33  0.055 0.059]
#  [0.362 0.488 0.263]
#  [0.054 0.715 0.606]
#  [0.95  0.314 0.41 ]
#  [0.361 0.501 0.631]]

19. 将numpy数组a中打印的项数限制为最多6个元素。

【知识点:输入和输出】

  • 如何限制numpy数组输出中打印的项目数?

【答案】

import numpy as np

a = np.arange(15)
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
np.set_printoptions(threshold=6)
print(a)
# [ 0  1  2 ... 12 13 14]

20. 打印完整的numpy数组a而不中断。

【知识点:输入和输出】

  • 如何打印完整的numpy数组而不中断?

【答案】

import numpy as np

a = np.arange(15)
np.set_printoptions(threshold=6)
print(a)
# [ 0  1  2 ... 12 13 14]
np.set_printoptions(threshold=np.iinfo(np.int).max)
print(a)
# [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]

当前活动


我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多