关于python:使用多维数组中的每个第一个元素

Using every first element in a multidimensional array

我曾经认为,如果运行print mdarray[::][1],您将打印数组中每个元素的第一个子元素。我哪里出了问题?

我特别需要一个p.plot(x,y[::][1]),在这里我绝对不想使用for循环,因为它非常慢,除非我把事情搞糊涂了。

我怎么了?谢谢!

编辑

我仍然不知道我从哪里得到了这件事,但我也解决了我的问题。

埃多克斯1〔2〕

1
p.plot(x,[i[1] for i in c],color='g',label="Closing value")

在时间上似乎没有任何明显的差别,所以我想我会用第二个,因为它看起来更像Python/可读性更强。还是我错过了什么?

谢谢你的帮助!


如果mdarray是一个numpy数组,您可以使用mdarray[:,0]访问它的第一列。

1
2
3
4
5
6
7
8
9
10
In [8]: mdarray = np.array([[1, 2, 4], [4, 5, 6], [7, 8, 9]])

In [9]: mdarray
Out[9]:
array([[1, 2, 4],
       [4, 5, 6],
       [7, 8, 9]])

In [10]: mdarray[:,0]
Out[10]: array([1, 4, 7])

UPD

快速肮脏试验

1
2
3
4
5
6
7
In [28]: mdarray = np.zeros((10000,10000))

In [29]: %timeit -n1000 [x[0] for x in mdarray]
1000 loops, best of 3: 2.7 ms per loop

In [30]: %timeit -n1000 mdarray[:,0]
1000 loops, best of 3: 567 ns per loop


你所做的:

你用的是mdarray[::]。这是对mdarray的(肤浅)复制。然后使用[1]访问它的第二个元素。[0]将是第一个。

你可以做的是一个列表理解:

1
[item[0] for item in mdarray]

这将返回mdarray中列表的第一个元素的列表。

谈论循环:一个(一次性)循环对于访问某个东西是相当有效的。在内部,所有的魔力函数(如上面的理解)都在迭代数据。


怎么样:

1
2
3
4
5
>>> Matrix = [[x for x in range(5)] for x in range(5)]
>>> Matrix
[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]
>>> [item[0] for item in Matrix]
[0, 0, 0, 0, 0]

至于::,您可以在这里了解更多,它将返回相同的列表。


不确定是使用数组还是列表,但对于python的列表:

Python2:

1
2
3
>>> mdarray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> zip(*mdarray)[0]
(1, 4, 7)

Python3:

1
2
3
>>> mdarray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> list(zip(*mdarray))[0]
(1, 4, 7)

或者对于索引0的特殊情况:

1
2
3
>>> mdarray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> next(zip(*mdarray))
(1, 4, 7)