SHOW:
|
|
- or go back to the newest paste.
1 | - | import numpy as np |
1 | + | import numpypy as np |
2 | ||
3 | if 'matrix' in np.__dict__: | |
4 | matrix = np.matrix | |
5 | else: | |
6 | class matrix(np.ndarray): | |
7 | pass | |
8 | ||
9 | ||
10 | ||
11 | def getShape(arrLikeItem): | |
12 | # doesn't work with sparse matrices, but it doesn't matter - | |
13 | # asarray().shape will yield also incorrect result in the case, | |
14 | # treating sparse matrices as objects | |
15 | shape = [] | |
16 | tmp = arrLikeItem | |
17 | while 1: | |
18 | if isinstance(tmp, np.ndarray): | |
19 | if tmp.shape == (): | |
20 | break | |
21 | elif tmp.shape[0] == 0: | |
22 | shape += tmp.shape | |
23 | break | |
24 | elif isinstance(tmp, matrix): | |
25 | shape += tmp.shape | |
26 | break | |
27 | else: | |
28 | shape.append(tmp.shape[0]) | |
29 | tmp = tmp[0] | |
30 | elif type(tmp) in (tuple, list): | |
31 | shape.append(len(tmp)) | |
32 | tmp = tmp[0] | |
33 | else: | |
34 | # a number or another item which should terminate | |
35 | break | |
36 | return tuple(shape) | |
37 | ||
38 | # version that should work with RPython: | |
39 | def getShapeRPython(arrLikeItem): | |
40 | # doesn't work with sparse matrices, but it doesn't matter - | |
41 | # asarray().shape will yield also incorrect result in the case, | |
42 | # treating sparse matrices as objects | |
43 | shape = [] | |
44 | Tmp = [arrLikeItem] | |
45 | ||
46 | while 1: | |
47 | tmp = Tmp[-1] | |
48 | if isinstance(tmp, np.ndarray): | |
49 | if tmp.shape == (): | |
50 | break | |
51 | elif tmp.shape[0] == 0: | |
52 | shape += tmp.shape | |
53 | break | |
54 | elif isinstance(tmp, matrix): | |
55 | shape += tmp.shape | |
56 | break | |
57 | else: | |
58 | shape.append(tmp.shape[0]) | |
59 | Tmp.append(tmp[0]) | |
60 | elif type(tmp) in (tuple, list): | |
61 | shape.append(len(tmp)) | |
62 | Tmp.append(tmp[0]) | |
63 | else: | |
64 | # a number or another item which should terminate | |
65 | break | |
66 | return tuple(shape) | |
67 | ||
68 | for a in [ | |
69 | 1, | |
70 | [1], | |
71 | [1, 2, 3], | |
72 | np.array((1, 2, 3)), | |
73 | - | np.array((1, 2, 3), object), |
73 | + | #np.array((1, 2, 3), object), #<-works in CPython but not PyPy |
74 | - | np.matrix(np.array((1, 2, 3))), |
74 | + | #np.matrix(np.array((1, 2, 3))), # <-works in CPython but not PyPy - matrix is absent yet |
75 | np.ones((2, 3, 4)), | |
76 | - | np.ones((0, 3, 4)), |
76 | + | #np.ones((0, 3, 4)), #np.array(a).shape gives incorrect shape of a: (0,), while it is (0,3,4) and my funcs return correct result |
77 | (((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))), | |
78 | np.array((((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12)))), | |
79 | ((np.array((1, 2, 3)), np.array((4, 5, 6))), (np.array((7, 8, 9)), np.array((10, 11, 12)))) | |
80 | ]: | |
81 | - | assert np.asarray(a).shape == getShape(a) == getShapeRPython(a) |
81 | + | |
82 | # print np.array(a).shape , getShape(a) , getShapeRPython(a) | |
83 | assert np.array(a).shape == getShape(a) == getShapeRPython(a) | |
84 | print('passed') |