首页 > 解决方案 > 如何将交替三角函数添加到 Python 中的数组?

问题描述

所以我想将交替的 Cos 和 Tan 函数添加到 python 中具有给定大小的数组中。例如,我有一个大小为 (10,5) 的 numpy 数组,我想为每一行添加 (Tan(a)、Cos(a)、Tan(a)、Cos(a)、Tan(a))。有人可以提供从哪里开始的提示吗?

我尝试在计数器小于 5 的情况下设置一个使用 while 循环的计数器,但这似乎不起作用。非常感谢您的建议。

标签: pythonnumpynumpy-ndarray

解决方案


解决方案

既然你要求交替,我想用三种交替给出一个更通用的答案:

  • 交替row
  • 交替column 你要求这个
  • 交替rowcolumn(两者):像棋盘

我将在后续示例中使用此虚拟数据:ABC

# dummy data
import numpy as np
angles = np.random.rand(5,4) * np.pi

A. 预期输出:交替行

[[tan, tan, tan, tan],
 [cos, cos, cos, cos],
 [tan, tan, tan, tan],
 [cos, cos, cos, cos],
 [tan, tan, tan, tan]]

代码:

# import numpy as np
a = np.zeros(angles.shape)
a[0::2, :] = np.tan(angles[0::2, :])
a[1::2, :] = np.cos(angles[1::2, :])

B. 预期输出:交替列

[[tan, cos, tan, cos],
 [tan, cos, tan, cos],
 [tan, cos, tan, cos],
 [tan, cos, tan, cos],
 [tan, cos, tan, cos]]

代码:

# import numpy as np
a = np.zeros(angles.shape)
a[:, 0::2] = np.tan(angles[:, 0::2])
a[:, 1::2] = np.cos(angles[:, 1::2])

C. 预期输出:行列交替

[[tan, cos, tan, cos],
 [cos, tan, cos, tan],
 [tan, cos, tan, cos],
 [cos, tan, cos, tan],
 [tan, cos, tan, cos]]

代码:

# import numpy as np
a = np.zeros(angles.shape)
a[0::2, 0::2] = np.tan(angles([0::2, 0::2])) # tan: odd-row, odd-column
a[0::2, 1::2] = np.cos(angles([0::2, 1::2])) # cos: odd-row, even-column
a[1::2, 0::2] = np.cos(angles([1::2, 0::2])) # cos: even-row, odd-column
a[1::2, 1::2] = np.tan(angles([1::2, 1::2])) # tan: even-row, even-column

D.numpy对交替行使用矢量化的好处

您可以使用以下自定义函数:custom_trig_func(). numpy如果可以跳过for循环,则将函数应用于numpy 数组会更快。您的代码矢量化程度越高,运行速度就越快。这里的方法避免使用循环并使用和for的内置向量化。numpy.tannumpy.cos

custom_trig_func(angles)

但是,如果您只想用最少的代码行来生成自定义函数的功能,请使用以下命令:

# angles is your input ndarray
even_rows = (np.arange(angles.shape[0]) % 2 == 0)
out = np.tan(angles)
out[even_rows, :] = np.cos(angles[even_rows, :])
print(out.shape) # out is your expected output

代码

import numpy as np

def custom_trig_func(angles: np.ndarray, validate=False) -> np.ndarray:
    """Returns an array of type -> numpy.ndarray and shape -> angles.shape, with 
    - odd rows operated on by numpy.tan() and, 
    - even rows operated on by numpy.cos().
    """

    # determine odd and even row indices
    rows = np.arange(angles.shape[0])
    even_rows = (rows % 2 == 0)
    odd_rows = ~even_rows

    # create output array
    out = np.tan(angles)
    out[even_rows, :] = np.cos(angles[even_rows, :])

    if validate:
        assert np.all(out[odd_rows, :] == np.tan(angles[odd_rows, :])), "Validation error in applying TAN to odd rows"
        assert np.all(out[even_rows, :] == np.cos(angles[even_rows, :])), "Validation error in applying COS to even rows"

    return out

# dummy data
angles = np.random.rand(10,5) * np.pi
# apply custom function
custom_trig_func(angles=angles, validate=True)

推荐阅读