2016-11-21 64 views
4

所以我想用numpy函数arange构造二维数组,并且我遇到了一些麻烦。具有numpy arange的二维数组

我想构造一个二维数组,其中位置i,j的入口是(i + j)。也就是说,这样的阵列(reccommended使用人气指数):

[[ 0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13] 
[ 5 6 7 8 9 10 11 12 13 14] 
[ 6 7 8 9 10 11 12 13 14 15] 
[ 7 8 9 10 11 12 13 14 15 16] 
[ 8 9 10 11 12 13 14 15 16 17] 
[ 9 10 11 12 13 14 15 16 17 18]] 

我还需要构建另一个阵列(100×100),其中在索引i的值,j为真,如果j是i和假的除数除此以外。也就是说,一个数组,看起来像:

[[False False False ..., False False False] 
[ True True True ..., True True True] 
[ True False True ..., False True False] 
..., 
[ True False False ..., True False False] 
[ True False False ..., False True False] 
[ True False False ..., False False True]] 

我无法使用嵌套循环(虽然我可以用循环来构建列表),我不能使用np.array功能。我目前的第一部分有以下内容,但我希望将它全部作为一个数组打印出来。

i = 0 
j= 10 
for i in range(10): 
    lis = np.arange(i, j) 
    i += 1 
    j += 1 
    print(np.array(lis)) 

如果我能得到一些帮助,那简直太好了

编辑:我当前的代码显示了这个输出:

[0 1 2 3 4 5 6 7 8 9] 
[ 1 2 3 4 5 6 7 8 9 10] 
[ 2 3 4 5 6 7 8 9 10 11] 
[ 3 4 5 6 7 8 9 10 11 12] 
[ 4 5 6 7 8 9 10 11 12 13] 
[ 5 6 7 8 9 10 11 12 13 14] 
[ 6 7 8 9 10 11 12 13 14 15] 
[ 7 8 9 10 11 12 13 14 15 16] 
[ 8 9 10 11 12 13 14 15 16 17] 
[ 9 10 11 12 13 14 15 16 17 18] 

为什么会在第一行不排队与其他行?

+0

发布的解决方案是否适合您?我看到你还没有接受你之前的任何问题的解决方案。在这里阅读更多有关接受解决方案的信息 - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Divakar

+0

谢谢!我其实已经认为我已经接受了一个解决方案,但我想我已经忘记了;感谢提醒 – schCivil

回答

2

根据您的第一个问题:

np.add(*np.indices((nrow, ncol))) 

nrow=5ncol=6

array([[0, 1, 2, 3, 4, 5], 
     [1, 2, 3, 4, 5, 6], 
     [2, 3, 4, 5, 6, 7], 
     [3, 4, 5, 6, 7, 8], 
     [4, 5, 6, 7, 8, 9]]) 

这种方法不使用numpy.arange功能尽管我觉得它更具可读性。此外,它支持nrow != ncol时的情况。

+0

太棒了,谢谢!我同意,它更具可读性并占用更少的空间 – schCivil

0

你可以试试这个第一个数组,你想:

np.array([range(i,i+10) for i in range(10)]) 

和第二阵列:

np.array([[i>0 and j%i==0 for j in range(10)] for i in range(10)]) 
+0

我将如何将其转换为数组?我看到它是如何工作的,但我的问题是我不能使用np.array函数;我建议使用np.arange来构建它 – schCivil

+0

你可以简单地使用像这样的np数组构造函数'np.array([range(i,i + 10)for i in range(10)])' – burhan

3

对于第二个数组,这里是与broadcasting一种方法 -

a = np.arange(10) 
out = (np.mod(a,a[:,None])==0) & (a[:,None]!=0) 

样品运行 -

In [511]: a = np.arange(10) 

In [512]: print (np.mod(a,a[:,None])==0) & (a[:,None]!=0) 
[[False False False False False False False False False False] 
[ True True True True True True True True True True] 
[ True False True False True False True False True False] 
[ True False False True False False True False False True] 
[ True False False False True False False False True False] 
[ True False False False False True False False False False] 
[ True False False False False False True False False False] 
[ True False False False False False False True False False] 
[ True False False False False False False False True False] 
[ True False False False False False False False False True]] 
4

做第一个与numpy的:

>>> a = np.arange(11) 
>>> a[:,None]+a 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
    [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], 
    [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
    [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 
    [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], 
    [ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], 
    [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], 
    [ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 
    [ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], 
    [ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
    [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]]) 

对于第二阵列,@Divakar具有良好的方法。也许有点简单的语法来做到这一点:

>>> (a%a[:,None])==0 
array([[ True, True, True, True, True, True, True, True, True, True, True], 
    [ True, True, True, True, True, True, True, True, True, True, True], 
    [ True, False, True, False, True, False, True, False, True, False, True], 
    [ True, False, False, True, False, False, True, False, False, True, False], 
    [ True, False, False, False, True, False, False, False, True, False, False], 
    [ True, False, False, False, False, True, False, False, False, False, True], 
    [ True, False, False, False, False, False, True, False, False, False, False], 
    [ True, False, False, False, False, False, False, True, False, False, False], 
    [ True, False, False, False, False, False, False, False, True, False, False], 
    [ True, False, False, False, False, False, False, False, False, True, False], 
    [ True, False, False, False, False, False, False, False, False, False, True]], dtype=bool) 
+0

Nice with第二个! OP可能正在寻找使用'np.arange(10)',而不是看着预期的o/p。 – Divakar

+0

谢谢!我看你是对的。 OP,更改$ 11 \ rightarrow 10 $ ... –

+0

$ 11/rightarrow 10 $是什么意思?我是编程初学者,所以idk是什么意思 – schCivil