返回一个numpy矩阵?

时间:2017-11-10 11:26:53

标签: python python-2.7

所以我要做的就是创建一个能够投掷2个骰子n次的函数。对于每次投掷,如果至少有一个骰子数是奇数,我们将返回该对值的总和,如果不是,我们只返回None。该程序的目标是返回一个矩阵,该矩阵有3列,n行代表每对掷骰子。第1列是第一个骰子的值,第2列是第二个骰子的值,第3列是1&的总和。 2或无。

这是我到目前为止的代码:

def dice(n):
    rolls = np.empty(shape=(n,3))
    for i in range(n):
        x = random.randint(1,6)
        y = random.randint(1,6)
        if x or y == 1 or 3 or 5:
            sum_2_dice = x + y
            rolls.append(x,y,sum_2_dice)
        if x and y != 1 or 3 or 5:
            sum_2_dice = None
            rolls.append(x,y,sum_2_dice)
    return rolls

运行该函数不会给我带来任何问题,但是当我像dice(2)

那样进行测试时

我得到AttributeError: 'numpy.ndarray' object has no attribute 'append'

我认为我们必须从一个空的numpy矩阵开始,然后能够将它附加到for循环中以获得3列(for循环将重复n次,我们因此得到一个矩阵有n行3列)

我们只允许进入numpy和随机,顺便说一句。

1 个答案:

答案 0 :(得分:1)

在创建正确大小的numpy数组时,不需要为其附加值。相反,您需要使用值填充数组。例如:

rolls = np.zeros(shape=(2, 3))
# [[ 0.  0.  0.]
#  [ 0.  0.  0.]]

rolls[1,:] = 1,2,3
# [[ 0.  0.  0.]
#  [ 1.  2.  3.]]

另一点需要注意的是,您的if语句没有按照您的想法行事。有关详细说明,请参阅this问题。

因此,对于您的例子,您可能想要

def dice(n):
    rolls = np.empty(shape=(n, 3))

    for i in range(n):
        x = random.randint(1,6)
        y = random.randint(1,6)

        if {x, y} & {1, 3, 5}:  # Suggested by Elazar in the comments  
        # if x in [1,3,5] or y in [1,3,5]:  # Another way to do it      
            sum_2_dice = x + y
            rolls[i,:] = x, y, sum_2_dice

        else:
            sum_2_dice = 0
            rolls[i,:] = x, y, sum_2_dice

    return rolls

如果 要返回矩阵(我认为没有任何好处),您只需在返回值时将其转换为:

return np.matrix(rolls)

您可以通过执行以下操作来检查输出类型:

result = dice(2)

print (type(result))
# <class 'numpy.matrixlib.defmatrix.matrix'>