Skip to content

Numpy 操作

以下是Bodo可以优化和并行化的数据并行Numpy操作符列表。

Numpy 逐元素 数组操作

一元运算符

  • +
  • -
  • ~

二元运算符

  • +
  • -
  • *
  • /
  • /?
  • %
  • |
  • >>
  • ^
  • <<
  • &
  • **
  • //

比较运算符

  • ==
  • !=
  • <
  • <=
  • >
  • >=

数据并行数学运算

  • numpy.add
  • numpy.subtract
  • numpy.multiply
  • numpy.divide
  • numpy.logaddexp
  • numpy.logaddexp2
  • numpy.true_divide
  • numpy.floor_divide
  • numpy.negative
  • numpy.positive
  • numpy.power
  • numpy.remainder
  • numpy.mod
  • numpy.fmod
  • numpy.abs
  • numpy.absolute
  • numpy.fabs
  • numpy.rint
  • numpy.sign
  • numpy.conj
  • numpy.exp
  • numpy.exp2
  • numpy.log
  • numpy.log2
  • numpy.log10
  • numpy.expm1
  • numpy.log1p
  • numpy.sqrt
  • numpy.square
  • numpy.reciprocal
  • numpy.gcd
  • numpy.lcm
  • numpy.conjugate

三角函数

  • numpy.sin
  • numpy.cos
  • numpy.tan
  • numpy.arcsin
  • numpy.arccos
  • numpy.arctan
  • numpy.arctan2
  • numpy.hypot
  • numpy.sinh
  • numpy.cosh
  • numpy.tanh
  • numpy.arcsinh
  • numpy.arccosh
  • numpy.arctanh
  • numpy.deg2rad
  • numpy.rad2deg
  • numpy.degrees
  • numpy.radians

位操作函数

  • numpy.bitwise_and
  • numpy.bitwise_or
  • numpy.bitwise_xor
  • numpy.bitwise_not
  • numpy.invert
  • numpy.left_shift
  • numpy.right_shift

比较函数

  • numpy.logical_and
  • numpy.logical_or
  • numpy.logical_xor
  • numpy.logical_not

浮动函数

  • numpy.isfinite
  • numpy.isinf
  • numpy.signbit
  • numpy.ldexp
  • numpy.floor
  • numpy.ceil
  • numpy.trunc

Numpy 降维函数

  • numpy.sum
  • numpy.prod
  • numpy.min
  • numpy.max
  • numpy.argmin
  • numpy.argmax
  • numpy.all
  • numpy.any

Numpy数组创建函数

  • numpy.empty
  • numpy.identity
  • numpy.zeros
  • numpy.ones
  • numpy.empty_like
  • numpy.zeros_like
  • numpy.ones_like
  • numpy.full_like
  • numpy.array
  • numpy.asarray
  • numpy.copy
  • numpy.arange
  • numpy.linspace
  • numpy.repeat 只接受标量 num_repeats

Numpy数组操作函数

  • numpy.shape
  • numpy.reshape

    shape 值不能为 -1。

  • numpy.sort

  • numpy.concatenate
  • numpy.append
  • numpy.unique 输出被假定为相对于输入是“小”的,并且被复制。 如果输出应该保持分布,请使用 Series.drop_duplicates()

  • numpy.where (1 和 3 个参数)

  • numpy.select 数值/布尔类型的默认值为 0/False。对于所有其他类型,默认值为 pd.NA。如果 choicelist 中的任何值是可为空的,或者默认值为 pd.NANone,则输出将是一个可为空的 pandas 数组,而不是一个 numpy 数组。
  • numpy.nan_to_num 将无穷大/NaN 值转换为常规浮点数。
  • numpy.union1d
  • numpy.intersect1d 尚未支持分布式
  • numpy.setdiff1d 目前尚不支持分布式
  • numpy.hstack 在每个等级上连接元素而不保持顺序
  • numpy.tile 支持两种情况:数组是 2D 且 reps 的形式是 (1, x),或者数组是 1D 且 reps 的形式是 (x, 1)
  • numpy.ndarray.T 支持二维数组的分布式数组转置。

Numpy数学和统计函数

  • numpy.cumsum
  • numpy.diff
  • numpy.percentile
  • numpy.quantile
  • numpy.median
  • numpy.mean
  • numpy.std
  • numpy.interp 目前没有分布式支持。
  • np.linalg.norm 仅对具有 axis=1 的 2D 输入进行了并行化。

随机数生成器函数

  • numpy.random.rand
  • numpy.random.randn
  • numpy.random.ranf
  • numpy.random.random_sample
  • numpy.random.sample
  • numpy.random.random
  • numpy.random.standard_normal
  • numpy.random.multivariate_normal (必须提供大小)
  • numpy.random.chisquare
  • numpy.random.weibull
  • numpy.random.power
  • numpy.random.geometric
  • numpy.random.exponential
  • numpy.random.poisson
  • numpy.random.rayleigh
  • numpy.random.normal
  • numpy.random.uniform
  • numpy.random.beta
  • numpy.random.binomial
  • numpy.random.f
  • numpy.random.gamma
  • numpy.random.lognormal
  • numpy.random.laplace
  • numpy.random.randint
  • numpy.random.triangular

numpy.dot 函数

  • numpy.dot 在一个矩阵和一个向量之间或在两个向量之间。

Numpy 输入输出

  • numpy.ndarray.tofile
  • numpy.fromfile 支持读取二进制文件。支持 filedtypecountoffset 参数(filedtype 是必需的)。file 应该是一个字符串。也支持 s3://hdfs:// 文件路径。

我们关于可扩展I/O的文档包含 示例用法和更多系统特定说明

Numpy 矩阵支持

  • numpy.asmatrix 仅对数组或矩阵输入进行了并行化。
  • * 左侧参数可以分配,但是右侧参数被复制。

杂项

  • Numpy数组理解:例如:A = np.array([i**2 for i in range(N)])

注意

除非在此明确提及,否则不支持可选参数。对于多维数组的操作,大小为1的维度的自动广播不支持。

Numpy dot() 并行化

函数 np.dot 根据输入数组的维度和分布有不同的分布规则。下面的例子演示了两种情况:

@bodo.jit
def example_dot(N, D):
    X = np.random.ranf((N, D))
    Y = np.random.ranf(N)
    w = np.dot(Y, X)
    z = np.dot(X, w)
    return z.sum()

example_dot(1024, 10)
example_dot.distributed_diagnostics()

这里是 distributed_diagnostics() 的输出:

Data distributions:
  $X.130               1D_Block
  $Y.131               1D_Block
  $b.2.158             REP

Parfor distributions:
  0                    1D_Block
  1                    1D_Block
  3                    1D_Block

Distributed listing for function example_dot, ../tmp/dist_rep.py (4)
++++++++++++++++++++++++++++++++++| parfor_id/variable: distribution
@bodo.jit                         |
def example_dot(N, D):            |
    X = np.random.ranf((N, D))++++| #0: 1D_Block, $X.130: 1D_Block
    Y = np.random.ranf(N)+++++++++| #1: 1D_Block, $Y.131: 1D_Block
    w = np.dot(Y, X)++++++++++++++| $b.2.158: REP
    z = np.dot(X, w)++++++++++++++| #3: 1D_Block
    return z.sum()                |

第一个 dot 具有一个一维数组,使用 1D_Block 分布作为第一个输入 Y,而第二个输入 X 是 一个二维数组,使用 1D_Block 分布。 因此,dot 是对分布式数据集的求和归约 ,因此,输出 (w) 位于 reduce 端并被 分配 REP 分布。

第二个 dot 具有一个 2D 数组,采用 1D_Block 分布(X)作为第一个输入,而第二个输入是 一个 REP 数组(w)。因此,计算在 X 的行之间是数据并行的, 这意味着输出(z)采用 1D_Block 分布。

变量 z 在分布报告中不存在,因为编译器优化能够消除它。它的值是动态生成和消费的,没有内存加载/存储开销。