矢量化函数用于不同形状的numpy数组

时间:2017-12-13 12:11:12

标签: python numpy

我想使用矢量化操作来实现高效代码,我在不同大小的数组上进行操作,这样就需要对数组进行切片。但是,我想调整函数,以便我可以使用扁平numpy数组进行计算,也可以使用n行进行计算。我在这个例子中使用了简单的数字,但在我的项目中将使用随机数生成。目前我已经使用if语句解决了它,以根据形状区分切片。没有if语句会有更有效的方法吗?

const Views = require('../service/views');

exports.findActiveByUserId = async (pUserId) => {
  const userDto = await UserRepository.findActiveByUserId(pUserId);
  if (!userDto) {
    throw new ServiceError(Err.USER_NOT_FOUND, Err.USER_NOT_FOUND_MSG);
  }
  return Views.UserInfo.build(userDto.toJson());
};

可能是因为我在这里找不到通用的切片方法?!

1 个答案:

答案 0 :(得分:4)

此代码有效。

def func(a, b, c, d):
    cf = -c
    cf[..., :b.shape[-1]] += a - b
    cf[..., -d.shape[-1]:] -= d
    return cf

测试:

## Test 1
a = np.array([1, 1, 1, 1, 1, 1, 1])
b = np.array([2, 2, 2, 2, 2, 2, 2])
c = np.array([3, 3, 3, 3, 3, 3, 3, 3])
d = np.array([4])
func(a, b, c, d)
"""
array([-4, -4, -4, -4, -4, -4, -4, -7])
"""

## Test 2
n = 2
a = np.zeros((n, 7))+1
b = np.zeros((n, 7))+2
c = np.zeros((n, 8))+3
d = np.zeros((n, 1))+4
func(a, b, c, d)
"""
array([[-4., -4., -4., -4., -4., -4., -4., -7.],
       [-4., -4., -4., -4., -4., -4., -4., -7.]])
"""