numpy-100,上手numpy的百题斩

什么是 numpy-100?

numpy-100 是一个练习集,来源于 numpy 的邮件列表、stackoverflow 以及 numpy 的官方文档。其目的是为了给新手(如果老玩家也需要的话)提供方便快捷的查询及相关练习。

开始做题吧

  1. 导入 numpy 包并命名为 np (★☆☆)
import numpy as np
  1. 查看 numpy 版本及配置信息 (★☆☆)
print(np.__version__)
np.show_config()
  1. 建立一个 10 维的零向量 (★☆☆)
x = np.zeros(10)
print(x)
  1. 获取某个 ndarray 占用的内存大小 (★☆☆)
x = np.zeros((10, 8))
print('{0} bytes'.format(x.size * x.itemsize))
  1. 如何在命令行中获取 numpy 中某个函数的帮助文档 (★☆☆)
python -c "import numpy as np; np.info(np.add)"
  1. 建立一个 10 维的零向量,并将其第 5 维的数设为 1 (★☆☆)
x = np.zeros(10)
x[5] = 1
print(x)
  1. 建立一个向量 [10, 11, ..., 49] (★☆☆)
x = np.arange(10, 50)
print(x)
  1. 翻转一个向量(首尾交换)(★☆☆)
x = np.arange(50)
x = x[::-1]
print(x)

9. 建立一个 3×3 的矩阵,值为 [0, 8] (★☆☆)

```python
x = np.arange(9).reshape(3, 3)
print(x)
  1. 找出 [1,2,0,0,4,0] 中所有非零数的下标 (★☆☆)
idx = np.nonzero([1,2,0,0,4,0])
print(idx)
  1. 建立一个 3×3 的单位矩阵 (★☆☆)
x = np.eye(3)
print(x)
  1. 建立一个 3×3×3 的随机数组 (★☆☆)
x = np.random.random((3,3,3))
print(x)
  1. 建立一个 10×10 的随机矩阵,并找出其中的最大值和最小值 (★☆☆)
x = np.random.random((10,10))
xmin, xmax = x.min(), x.max()
print(xmin, xmax)
  1. 建立一个 30 维的随机向量,并计算均值 (★☆☆)
x = np.random.random(30)
xmean = x.mean()
print(xmean)
  1. 建立一个矩阵,最外层为 1,内部用 0 填充 (★☆☆)
x = np.ones((10,10))
x[1:-1, 1:-1] = 0
print(x)
  1. 为某个数组添加 padding (★☆☆)
x = np.random.random((5,5))
x = np.pad(x, pad_width=1, mode='constant', constant_values=0)
print(x)
  1. 下列表达式的值是什么?(★☆☆)
print(0 * np.nan)                 # nan
print(np.nan == np.nan)           # False
print(np.inf > np.nan)            # False
print(np.nan - np.nan)            # nan
print(0.3 == 3 * 0.1)             # False
  1. 建立一个 5×5 的零矩阵,对角线下方的值为 1,2,3,4 (★☆☆)
x = np.diag(np.arange(1,5), k=-1)
print(x)
  1. 建立一个 0-1 矩阵,按国际象棋棋盘一样交错分布 (★☆☆)
x = np.zeros((13,13))
x[1::2, ::2] = 1
x[::2, 1::2] = 1
print(x)
  1. 在一个 6×7×8 的数组中,第 100 个数的下标 (x,y,z) 是多少?(★☆☆)
print(np.unravel_index(99, (6,7,8)))
  1. np.tile() 建立一个按国际象棋棋盘一样交错分布的 0-1 矩阵 (★☆☆)
x = np.tile(np.array([0,1],[1,0]), (4,4))
  1. 归一化一个随机矩阵 (★☆☆)
x = np.random.random((5,5))
xmin, xmax = x.min(), x.max()
x = (x-xmin)/(xmax-xmin)
print(x)
  1. 创建一个自定义的 dtype,表示 RGBA 颜色 (4 unsigned bytes) (★☆☆)
rgba_color = np.dtype([("r", np.ubyte, 1),
                       ("g", np.ubyte, 1),
                       ("b", np.ubyte, 1),
                       ("a", np.ubyte, 1)])
print(rgba_color)
  1. 计算矩阵乘积 (★☆☆)
print(np.dot(np.ones((5,3)), np.ones((3,2))))   # solution A
print(np.ones((4,3)) @ np.ones((3,2)))          # solution B in python35 and later
  1. 将向量中所有处于 [3,8] 区间内的数取其相反数 (★☆☆)
x = np.arange(16)
x[(3 <= x) & (x <= 8)] *= -1
print(x)
  1. 以下程序会输出什么?(★☆☆)
print(sum(range(5),-1))      # 9
from numpy import *          # import numpy.sum
print(sum(range(5),-1))      # 10
  1. 如果 x 是个整型向量,那么以下哪些表达式是合法的?(★☆☆)
x**x             # legal
2 << x >> 2      # illegal
x <- x           # legal
1j*x             # legal
x/1/1            # legal
x<x>x            # illegal
  1. 以下表达式的结果是?(★☆☆)
print(np.array(0) / np.array(0))                        # nan
print(np.array(0) // np.array(0))                       # 0
print(np.array([np.nan]).astype(int).astype(float))     # [-9.22337204e+18]
  1. 如何四舍五入?(★☆☆)
x = np.random.uniform(-10,+10,10)
print (np.copysign(np.ceil(np.abs(x)), x))
  1. 找到两个数组中公有的数 (★☆☆)
x1 = np.random.randint(0,10,10)
x2 = np.random.randint(0,10,10)
print(x1,x2)
print(np.intersect1d(x1,x2))
  1. 如何关闭 numpy 的警告?(★☆☆)
with np.errstate(divide='ignore'):
    x = np.ones(1) / 0
  1. 这个表达式为 True 吗?(★☆☆)
np.sqrt(-1) == np.emath.sqrt(-1)        # False
  1. 如何获取昨天、今天、明天的日期?(★☆☆)
yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today     = np.datetime64('today', 'D')
tomorrow  = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
  1. 如何获得 2018 年 8 月的所有日期?(★★☆)
dates = np.arange('2018-08', '2018-09', dtype='datetime64[D]')
print(dates)
  1. 如何即时计算(无需拷贝地)\((a+b)\cdot(-a/2)\) ? (★★☆)
a = np.random.random(3)
b = np.random.random(3)
np.add(a, b, out=b)
np.negative(a, out=a)
np.divide(a, 2, out=a)
np.multiply(a, b, out=a)
print(a)
  1. 为一个随机向量取其整数部分(5种方法)(★★☆)
x = np.random.random(6) * 10
print(x)
print(x - x%1)
print(np.floor(x))
print(np.ceil(x) - 1)
print(x.astype(int))
print(np.trunc(x))
  1. 创建一个 5 阶矩阵,每行上的数值都是 0 到 4 (★★☆)
x = np.zeros((5,5))
x += np.arange(5)
print(x)
  1. 使用生成器(generator)创建一个向量 (★☆☆)
def gen():
    for i in range(10):
        yield i

x = np.fromiter(gen(), dtype=int, count=-1)
print(x)
  1. 创建一个 10 维向量,均分区间 \((0, 1)\) 上 (★★☆)
x = np.linspace(0, 1, 11, endpoint=False)[1:]
print(x)
  1. 创建 10 维随机向量,并升序排序 (★★☆)
x = np.random.random(10)
x.sort()
print(x)
  1. darray 很小的时候,如何更快地求和?(比 np.sum 快)(★★☆)
x = np.random.random(5)
print(np.add.reduce(x))
  1. 对于两个随机向量,判断其是否相等 (★★☆)
# x = np.random.randint(0, 2, 5)
# y = np.random.randint(0, 2, 5)
x = np.array([1,2,3,4,5, 5.999999])
y = np.array([1,2,3,4,5,6])
print(np.allclose(x, y))        # True, 允许误差
print(np.array_equal(x, y))     # False, 不允许误差
  1. 使一个数组只读 (★★☆)
x = np.random.random(6)
x.flags.writeable = False
x[0] = 0
  1. 有一个 10×2 的矩阵,保存了 10 个笛卡尔坐标,把它们转化成极坐标 (★★☆)
cardesian = np.random.random((10, 2))
x, y = cardesian[:, 0], cardesian[:, 1]
rho = np.sqrt(x**2 + y**2)
theta = np.arctan2(y, x)
polar = np.dstack((rho, theta))[0]
print(polar)
  1. 把数组中最大的那个数替换为 0 (★★☆)
x = np.random.random(10)
x[x.argmax()] = 0
print(x)
  1. 创建一个结构化数组,其 x 和 y 坐标覆盖 \([0,1]\times [0,1]\) 区域 (★★☆)
coordinates = np.zeros((11, 11), [('x', float), ('y', float)])
coordinates['x'], coordinates['y'] = np.meshgrid(np.linspace(0, 1, 11),
                                                 np.linspace(0, 1, 11))
print(coordinates)
  1. 已知两个向量 \(\vec{x}, \vec{y}\),求它们的柯西矩阵 \(\bf{C}\) (\(\bf{C}_{ij} = \frac{1}{x_i - y_j}\)) (★★☆)
x = np.random.random(10)
y = np.random.random(10)
C = 1.0 / np.subtract.outer(x, y)
print(C)
  1. 查询各个 dtype 的最大最小值以及精度 (★★☆)
for dtype in [np.int8, np.int32, np.int64]:
    print(dtype)
    print(np.iinfo(dtype).min)
    print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
    print(dtype)
    print(np.finfo(dtype).min)
    print(np.finfo(dtype).max)
    print(np.finfo(dtype).eps)
  1. 打印整个 darray (★★☆)
np.set_printoptions(threshold=np.nan)
x = np.ones((32,32))
print(x)
  1. 找到数组中最接近给定 key 的数 (★★☆)
x = np.random.randint(20, size=(20))
print(x)
key = np.random.uniform(0, 20)
print(key)
idx = np.abs(key-x).argmin()
print(x[idx])
  1. 创建一个结构化的数组表示坐标 (x,y) 和颜色 (r,g,b) (★★☆)
foo = np.zeros(10, [('coordinate', [('x', float, 1),
                                    ('y', float, 1)]),
                    ('color', [('r', float, 1),
                               ('g', float, 1),
                               ('b', float, 1)])])
print(foo)
  1. 给定一个随机 (100×2) 的数据,表示平面上的 100 个点,求它们之间的距离。 (★★☆)
Z = np.random.random((10,2))
X,Y = np.atleast_2d(Z[:,0], Z[:,1])
D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
print(D)

# Much faster with scipy
import scipy
# Thanks Gavin Heverly-Coulson (#issue 1)
import scipy.spatial

Z = np.random.random((10,2))
D = scipy.spatial.distance.cdist(Z,Z)
print(D)
  1. float32 的数组 in place 地转化成 int32 的数组。
x = np.random.random((2,3), dtype=np.float32)
x = x.astype(np.int32, copy=False)
print(x)
  1. 如何读入以下文件?(★★☆)
from io import StringIO
# Fake file
s = StringIO("""1, 2, 3, 4, 5\n
                6,  ,  , 7, 8\n
                 ,  , 9,10,11\n""")
                 
# solution
x = np.genfromtext(s, delimiter=',', dtype=np.int)

Continue...