【问题标题】:Sum three elements in every row of the matrix - without loops在矩阵的每一行中求和三个元素 - 没有循环
【发布时间】:2019-06-16 10:09:36
【问题描述】:

我想写一个函数SumThree,它接收一个大小为(n x (n+2))的矩阵作为一个numpy数组,并返回一个向量v,它的定义方式如下:v[i] = A[i,i] + A[i,i+1] + A[i,i+2]

限制: 没有循环,你不能使用函数sum (np.sum)

我确实通过使用递归和更改函数的签名(它应该只接收矩阵)来解决它。但我正在寻找一种更简单、更有效的解决方案。

类似这样的东西(这是我尝试过的):

def sumThree(array, curr=0, i=0, v=[]):
 if curr < array.size
   curr += array.shape[1]
 else
   return v
 count = array.size
 v[i] = array[curr,curr] + array[curr,curr+1] + array[curr,curr+2]
 sumThree(array, curr, i+1, v)

我还没有尝试过,但我认为这应该可行:

def sumThree(a):
  return (a.diagonal() + a.diagonal(1) + a.diagonal(2))

【问题讨论】:

  • 你被要求不使用循环的原因是你可以使用 numpy 向量化。递归不是解决这个问题的正确方法。
  • @rdas 是的,你是对的,我正在尝试使用一些 numpy 函数。我认为diagonal() 应该解决这个问题。参考:docs.scipy.org/doc/numpy/reference/generated/…

标签: python arrays matrix


【解决方案1】:

您可以使用numpy.diagonal 获得特定的对角线(带有所需的偏移量)

你可以试试这个,看看它是否适合你?

def sumThree(a):
    return a.diagonal(offset=0) + a.diagonal(offset=1) + a.diagonal(offset=2)

这是一个完整的例子:

import numpy as np

def sumThree(a):
    return a.diagonal(offset=0) + a.diagonal(offset=1) + a.diagonal(offset=2)


my_arr = np.arange(48).reshape(6,8)
print(my_arr)
print("\n\n\n")
print(sumThree(my_arr))

它输出:

[[ 0  1  2  3  4  5  6  7]
 [ 8  9 10 11 12 13 14 15]
 [16 17 18 19 20 21 22 23]
 [24 25 26 27 28 29 30 31]
 [32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47]]




[  3  30  57  84 111 138]

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 2020-01-18
    相关资源
    最近更新 更多