maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of maxframe might be problematic. Click here for more details.

Files changed (443) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp37-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +9 -8
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +38 -1
  15. maxframe/codegen/spe/dataframe/misc.py +11 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +32 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +39 -18
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  29. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  30. maxframe/codegen/spe/dataframe/tseries.py +9 -0
  31. maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
  32. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  33. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  34. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  35. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  36. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  37. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  38. maxframe/codegen/spe/tensor/__init__.py +3 -0
  39. maxframe/codegen/spe/tensor/datasource.py +1 -0
  40. maxframe/codegen/spe/tensor/fft.py +74 -0
  41. maxframe/codegen/spe/tensor/linalg.py +29 -2
  42. maxframe/codegen/spe/tensor/misc.py +79 -25
  43. maxframe/codegen/spe/tensor/spatial.py +45 -0
  44. maxframe/codegen/spe/tensor/statistics.py +44 -0
  45. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  46. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  47. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  48. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  49. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  50. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  51. maxframe/codegen/spe/utils.py +2 -0
  52. maxframe/config/config.py +73 -9
  53. maxframe/config/tests/test_validators.py +13 -1
  54. maxframe/config/validators.py +49 -0
  55. maxframe/conftest.py +54 -17
  56. maxframe/core/accessor.py +2 -2
  57. maxframe/core/base.py +2 -1
  58. maxframe/core/entity/core.py +5 -0
  59. maxframe/core/entity/tileables.py +3 -1
  60. maxframe/core/graph/core.cp37-win32.pyd +0 -0
  61. maxframe/core/graph/entity.py +8 -3
  62. maxframe/core/mode.py +6 -1
  63. maxframe/core/operator/base.py +9 -2
  64. maxframe/core/operator/core.py +10 -2
  65. maxframe/core/operator/utils.py +13 -0
  66. maxframe/dataframe/__init__.py +12 -5
  67. maxframe/dataframe/accessors/__init__.py +1 -1
  68. maxframe/dataframe/accessors/compat.py +45 -0
  69. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  70. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  71. maxframe/dataframe/accessors/dict_/core.py +48 -0
  72. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  73. maxframe/dataframe/accessors/dict_/length.py +7 -16
  74. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  75. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  76. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  77. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  78. maxframe/dataframe/accessors/list_/core.py +48 -0
  79. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  80. maxframe/dataframe/accessors/list_/length.py +7 -16
  81. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  82. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  83. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  84. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  85. maxframe/dataframe/accessors/struct_/core.py +43 -0
  86. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  87. maxframe/dataframe/accessors/struct_/field.py +123 -0
  88. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  89. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  90. maxframe/dataframe/arithmetic/__init__.py +18 -4
  91. maxframe/dataframe/arithmetic/between.py +106 -0
  92. maxframe/dataframe/arithmetic/dot.py +237 -0
  93. maxframe/dataframe/arithmetic/maximum.py +33 -0
  94. maxframe/dataframe/arithmetic/minimum.py +33 -0
  95. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  96. maxframe/dataframe/core.py +161 -224
  97. maxframe/dataframe/datasource/__init__.py +18 -0
  98. maxframe/dataframe/datasource/core.py +6 -0
  99. maxframe/dataframe/datasource/direct.py +57 -0
  100. maxframe/dataframe/datasource/from_dict.py +124 -0
  101. maxframe/dataframe/datasource/from_index.py +1 -1
  102. maxframe/dataframe/datasource/from_records.py +77 -0
  103. maxframe/dataframe/datasource/from_tensor.py +109 -41
  104. maxframe/dataframe/datasource/read_csv.py +21 -14
  105. maxframe/dataframe/datasource/read_odps_query.py +29 -6
  106. maxframe/dataframe/datasource/read_odps_table.py +32 -10
  107. maxframe/dataframe/datasource/read_parquet.py +38 -39
  108. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  109. maxframe/dataframe/datastore/__init__.py +11 -1
  110. maxframe/dataframe/datastore/direct.py +268 -0
  111. maxframe/dataframe/datastore/to_csv.py +29 -41
  112. maxframe/dataframe/datastore/to_odps.py +36 -4
  113. maxframe/dataframe/extensions/__init__.py +20 -4
  114. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  115. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  116. maxframe/dataframe/extensions/collect_kv.py +126 -0
  117. maxframe/dataframe/extensions/extract_kv.py +177 -0
  118. maxframe/dataframe/extensions/flatjson.py +2 -1
  119. maxframe/dataframe/extensions/map_reduce.py +263 -0
  120. maxframe/dataframe/extensions/rebalance.py +62 -0
  121. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  122. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  123. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  124. maxframe/dataframe/groupby/__init__.py +17 -2
  125. maxframe/dataframe/groupby/aggregation.py +86 -49
  126. maxframe/dataframe/groupby/apply.py +1 -1
  127. maxframe/dataframe/groupby/apply_chunk.py +19 -5
  128. maxframe/dataframe/groupby/core.py +116 -16
  129. maxframe/dataframe/groupby/cum.py +4 -25
  130. maxframe/dataframe/groupby/expanding.py +264 -0
  131. maxframe/dataframe/groupby/fill.py +1 -1
  132. maxframe/dataframe/groupby/getitem.py +12 -5
  133. maxframe/dataframe/groupby/head.py +11 -1
  134. maxframe/dataframe/groupby/rank.py +136 -0
  135. maxframe/dataframe/groupby/rolling.py +206 -0
  136. maxframe/dataframe/groupby/shift.py +114 -0
  137. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  138. maxframe/dataframe/indexing/__init__.py +22 -2
  139. maxframe/dataframe/indexing/droplevel.py +195 -0
  140. maxframe/dataframe/indexing/filter.py +169 -0
  141. maxframe/dataframe/indexing/get_level_values.py +76 -0
  142. maxframe/dataframe/indexing/iat.py +45 -0
  143. maxframe/dataframe/indexing/iloc.py +152 -12
  144. maxframe/dataframe/indexing/insert.py +46 -18
  145. maxframe/dataframe/indexing/loc.py +287 -7
  146. maxframe/dataframe/indexing/reindex.py +14 -5
  147. maxframe/dataframe/indexing/rename.py +6 -0
  148. maxframe/dataframe/indexing/rename_axis.py +2 -2
  149. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  150. maxframe/dataframe/indexing/reset_index.py +33 -6
  151. maxframe/dataframe/indexing/sample.py +8 -0
  152. maxframe/dataframe/indexing/setitem.py +3 -3
  153. maxframe/dataframe/indexing/swaplevel.py +185 -0
  154. maxframe/dataframe/indexing/take.py +99 -0
  155. maxframe/dataframe/indexing/truncate.py +140 -0
  156. maxframe/dataframe/indexing/where.py +0 -11
  157. maxframe/dataframe/indexing/xs.py +148 -0
  158. maxframe/dataframe/merge/__init__.py +15 -1
  159. maxframe/dataframe/merge/append.py +97 -98
  160. maxframe/dataframe/merge/combine.py +244 -0
  161. maxframe/dataframe/merge/combine_first.py +120 -0
  162. maxframe/dataframe/merge/compare.py +387 -0
  163. maxframe/dataframe/merge/concat.py +183 -0
  164. maxframe/dataframe/merge/update.py +271 -0
  165. maxframe/dataframe/misc/__init__.py +28 -11
  166. maxframe/dataframe/misc/_duplicate.py +10 -4
  167. maxframe/dataframe/misc/apply.py +1 -1
  168. maxframe/dataframe/misc/check_unique.py +82 -0
  169. maxframe/dataframe/misc/clip.py +145 -0
  170. maxframe/dataframe/misc/describe.py +175 -9
  171. maxframe/dataframe/misc/drop.py +31 -0
  172. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  173. maxframe/dataframe/misc/duplicated.py +2 -2
  174. maxframe/dataframe/misc/get_dummies.py +5 -1
  175. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  176. maxframe/dataframe/misc/isin.py +2 -2
  177. maxframe/dataframe/misc/map.py +125 -18
  178. maxframe/dataframe/misc/repeat.py +159 -0
  179. maxframe/dataframe/misc/tests/test_misc.py +48 -3
  180. maxframe/dataframe/misc/to_numeric.py +3 -0
  181. maxframe/dataframe/misc/transform.py +12 -5
  182. maxframe/dataframe/misc/transpose.py +13 -1
  183. maxframe/dataframe/misc/valid_index.py +115 -0
  184. maxframe/dataframe/misc/value_counts.py +38 -4
  185. maxframe/dataframe/missing/checkna.py +14 -6
  186. maxframe/dataframe/missing/dropna.py +5 -0
  187. maxframe/dataframe/missing/fillna.py +1 -1
  188. maxframe/dataframe/missing/replace.py +7 -4
  189. maxframe/dataframe/reduction/__init__.py +35 -16
  190. maxframe/dataframe/reduction/aggregation.py +43 -14
  191. maxframe/dataframe/reduction/all.py +2 -2
  192. maxframe/dataframe/reduction/any.py +2 -2
  193. maxframe/dataframe/reduction/argmax.py +103 -0
  194. maxframe/dataframe/reduction/argmin.py +103 -0
  195. maxframe/dataframe/reduction/core.py +80 -24
  196. maxframe/dataframe/reduction/count.py +13 -9
  197. maxframe/dataframe/reduction/cov.py +166 -0
  198. maxframe/dataframe/reduction/cummax.py +2 -2
  199. maxframe/dataframe/reduction/cummin.py +2 -2
  200. maxframe/dataframe/reduction/cumprod.py +2 -2
  201. maxframe/dataframe/reduction/cumsum.py +2 -2
  202. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  203. maxframe/dataframe/reduction/idxmax.py +185 -0
  204. maxframe/dataframe/reduction/idxmin.py +185 -0
  205. maxframe/dataframe/reduction/kurtosis.py +37 -30
  206. maxframe/dataframe/reduction/max.py +2 -2
  207. maxframe/dataframe/reduction/mean.py +9 -7
  208. maxframe/dataframe/reduction/median.py +2 -2
  209. maxframe/dataframe/reduction/min.py +2 -2
  210. maxframe/dataframe/reduction/mode.py +144 -0
  211. maxframe/dataframe/reduction/nunique.py +19 -11
  212. maxframe/dataframe/reduction/prod.py +18 -13
  213. maxframe/dataframe/reduction/reduction_size.py +2 -2
  214. maxframe/dataframe/reduction/sem.py +13 -9
  215. maxframe/dataframe/reduction/skew.py +31 -27
  216. maxframe/dataframe/reduction/str_concat.py +10 -7
  217. maxframe/dataframe/reduction/sum.py +18 -14
  218. maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
  219. maxframe/dataframe/reduction/unique.py +20 -3
  220. maxframe/dataframe/reduction/var.py +16 -12
  221. maxframe/dataframe/reshape/__init__.py +38 -0
  222. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  223. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  224. maxframe/dataframe/reshape/unstack.py +114 -0
  225. maxframe/dataframe/sort/__init__.py +16 -1
  226. maxframe/dataframe/sort/argsort.py +68 -0
  227. maxframe/dataframe/sort/core.py +2 -1
  228. maxframe/dataframe/sort/nlargest.py +238 -0
  229. maxframe/dataframe/sort/nsmallest.py +228 -0
  230. maxframe/dataframe/sort/rank.py +147 -0
  231. maxframe/dataframe/statistics/__init__.py +3 -3
  232. maxframe/dataframe/statistics/corr.py +1 -0
  233. maxframe/dataframe/statistics/quantile.py +2 -2
  234. maxframe/dataframe/tests/test_typing.py +104 -0
  235. maxframe/dataframe/tests/test_utils.py +66 -2
  236. maxframe/dataframe/tseries/__init__.py +19 -0
  237. maxframe/dataframe/tseries/at_time.py +61 -0
  238. maxframe/dataframe/tseries/between_time.py +122 -0
  239. maxframe/dataframe/typing_.py +185 -0
  240. maxframe/dataframe/utils.py +125 -52
  241. maxframe/dataframe/window/aggregation.py +8 -4
  242. maxframe/dataframe/window/core.py +14 -1
  243. maxframe/dataframe/window/ewm.py +1 -3
  244. maxframe/dataframe/window/expanding.py +37 -35
  245. maxframe/dataframe/window/rolling.py +49 -39
  246. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  247. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  248. maxframe/env.py +7 -4
  249. maxframe/errors.py +2 -2
  250. maxframe/io/odpsio/schema.py +9 -3
  251. maxframe/io/odpsio/tableio.py +7 -2
  252. maxframe/io/odpsio/tests/test_schema.py +198 -83
  253. maxframe/learn/__init__.py +10 -2
  254. maxframe/learn/cluster/__init__.py +15 -0
  255. maxframe/learn/cluster/_kmeans.py +782 -0
  256. maxframe/learn/contrib/llm/core.py +18 -7
  257. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  258. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  259. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  260. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  261. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  262. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  263. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  264. maxframe/learn/contrib/llm/models/__init__.py +1 -0
  265. maxframe/learn/contrib/llm/models/dashscope.py +12 -6
  266. maxframe/learn/contrib/llm/models/managed.py +76 -11
  267. maxframe/learn/contrib/llm/models/openai.py +72 -0
  268. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  269. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  270. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  271. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  272. maxframe/learn/contrib/llm/text.py +348 -42
  273. maxframe/learn/contrib/models.py +4 -1
  274. maxframe/learn/contrib/xgboost/classifier.py +2 -0
  275. maxframe/learn/contrib/xgboost/core.py +113 -4
  276. maxframe/learn/contrib/xgboost/predict.py +4 -2
  277. maxframe/learn/contrib/xgboost/regressor.py +5 -0
  278. maxframe/learn/contrib/xgboost/train.py +7 -2
  279. maxframe/learn/core.py +66 -0
  280. maxframe/learn/linear_model/_base.py +58 -1
  281. maxframe/learn/linear_model/_lin_reg.py +1 -1
  282. maxframe/learn/metrics/__init__.py +6 -0
  283. maxframe/learn/metrics/_classification.py +145 -0
  284. maxframe/learn/metrics/_ranking.py +477 -0
  285. maxframe/learn/metrics/_scorer.py +60 -0
  286. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  287. maxframe/learn/metrics/pairwise/core.py +77 -0
  288. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  289. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  290. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  291. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  292. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  293. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  294. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  295. maxframe/learn/metrics/tests/__init__.py +13 -0
  296. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  297. maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
  298. maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
  299. maxframe/learn/utils/__init__.py +2 -1
  300. maxframe/learn/utils/checks.py +1 -2
  301. maxframe/learn/utils/core.py +59 -0
  302. maxframe/learn/utils/extmath.py +79 -9
  303. maxframe/learn/utils/odpsio.py +262 -0
  304. maxframe/learn/utils/validation.py +2 -2
  305. maxframe/lib/compat.py +40 -0
  306. maxframe/lib/dtypes_extension/__init__.py +16 -1
  307. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  308. maxframe/lib/dtypes_extension/blob.py +304 -0
  309. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  310. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  311. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  312. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  313. maxframe/lib/filesystem/_oss_lib/common.py +124 -50
  314. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  315. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  316. maxframe/lib/filesystem/base.py +1 -1
  317. maxframe/lib/filesystem/core.py +1 -1
  318. maxframe/lib/filesystem/oss.py +115 -46
  319. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  320. maxframe/lib/mmh3.cp37-win32.pyd +0 -0
  321. maxframe/lib/wrapped_pickle.py +10 -0
  322. maxframe/opcodes.py +41 -15
  323. maxframe/protocol.py +12 -0
  324. maxframe/remote/core.py +4 -0
  325. maxframe/serialization/__init__.py +11 -2
  326. maxframe/serialization/arrow.py +38 -13
  327. maxframe/serialization/blob.py +32 -0
  328. maxframe/serialization/core.cp37-win32.pyd +0 -0
  329. maxframe/serialization/core.pyx +39 -1
  330. maxframe/serialization/exception.py +2 -4
  331. maxframe/serialization/numpy.py +11 -0
  332. maxframe/serialization/pandas.py +46 -9
  333. maxframe/serialization/serializables/core.py +2 -2
  334. maxframe/serialization/tests/test_serial.py +31 -4
  335. maxframe/tensor/__init__.py +38 -8
  336. maxframe/tensor/arithmetic/__init__.py +19 -10
  337. maxframe/tensor/arithmetic/core.py +2 -2
  338. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  339. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
  340. maxframe/tensor/core.py +6 -2
  341. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  342. maxframe/tensor/extensions/__init__.py +2 -0
  343. maxframe/tensor/extensions/apply_chunk.py +3 -3
  344. maxframe/tensor/extensions/rebalance.py +65 -0
  345. maxframe/tensor/fft/__init__.py +32 -0
  346. maxframe/tensor/fft/core.py +168 -0
  347. maxframe/tensor/fft/fft.py +112 -0
  348. maxframe/tensor/fft/fft2.py +118 -0
  349. maxframe/tensor/fft/fftfreq.py +80 -0
  350. maxframe/tensor/fft/fftn.py +123 -0
  351. maxframe/tensor/fft/fftshift.py +79 -0
  352. maxframe/tensor/fft/hfft.py +112 -0
  353. maxframe/tensor/fft/ifft.py +114 -0
  354. maxframe/tensor/fft/ifft2.py +115 -0
  355. maxframe/tensor/fft/ifftn.py +123 -0
  356. maxframe/tensor/fft/ifftshift.py +73 -0
  357. maxframe/tensor/fft/ihfft.py +93 -0
  358. maxframe/tensor/fft/irfft.py +118 -0
  359. maxframe/tensor/fft/irfft2.py +62 -0
  360. maxframe/tensor/fft/irfftn.py +114 -0
  361. maxframe/tensor/fft/rfft.py +116 -0
  362. maxframe/tensor/fft/rfft2.py +63 -0
  363. maxframe/tensor/fft/rfftfreq.py +87 -0
  364. maxframe/tensor/fft/rfftn.py +113 -0
  365. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  366. maxframe/tensor/linalg/__init__.py +7 -0
  367. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  368. maxframe/tensor/linalg/cholesky.py +117 -0
  369. maxframe/tensor/linalg/einsum.py +339 -0
  370. maxframe/tensor/linalg/lstsq.py +100 -0
  371. maxframe/tensor/linalg/matrix_norm.py +75 -0
  372. maxframe/tensor/linalg/norm.py +249 -0
  373. maxframe/tensor/linalg/solve.py +72 -0
  374. maxframe/tensor/linalg/solve_triangular.py +2 -2
  375. maxframe/tensor/linalg/vector_norm.py +113 -0
  376. maxframe/tensor/misc/__init__.py +24 -1
  377. maxframe/tensor/misc/argwhere.py +72 -0
  378. maxframe/tensor/misc/array_split.py +46 -0
  379. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  380. maxframe/tensor/misc/copyto.py +130 -0
  381. maxframe/tensor/misc/delete.py +104 -0
  382. maxframe/tensor/misc/dsplit.py +68 -0
  383. maxframe/tensor/misc/ediff1d.py +74 -0
  384. maxframe/tensor/misc/expand_dims.py +85 -0
  385. maxframe/tensor/misc/flip.py +90 -0
  386. maxframe/tensor/misc/fliplr.py +64 -0
  387. maxframe/tensor/misc/flipud.py +68 -0
  388. maxframe/tensor/misc/hsplit.py +85 -0
  389. maxframe/tensor/misc/insert.py +139 -0
  390. maxframe/tensor/misc/moveaxis.py +83 -0
  391. maxframe/tensor/misc/result_type.py +88 -0
  392. maxframe/tensor/misc/roll.py +124 -0
  393. maxframe/tensor/misc/rollaxis.py +77 -0
  394. maxframe/tensor/misc/shape.py +89 -0
  395. maxframe/tensor/misc/split.py +190 -0
  396. maxframe/tensor/misc/tile.py +109 -0
  397. maxframe/tensor/misc/vsplit.py +74 -0
  398. maxframe/tensor/reduction/array_equal.py +2 -1
  399. maxframe/tensor/sort/__init__.py +2 -0
  400. maxframe/tensor/sort/argpartition.py +98 -0
  401. maxframe/tensor/sort/partition.py +228 -0
  402. maxframe/tensor/spatial/__init__.py +15 -0
  403. maxframe/tensor/spatial/distance/__init__.py +17 -0
  404. maxframe/tensor/spatial/distance/cdist.py +421 -0
  405. maxframe/tensor/spatial/distance/pdist.py +398 -0
  406. maxframe/tensor/spatial/distance/squareform.py +153 -0
  407. maxframe/tensor/special/__init__.py +159 -21
  408. maxframe/tensor/special/airy.py +55 -0
  409. maxframe/tensor/special/bessel.py +199 -0
  410. maxframe/tensor/special/core.py +65 -4
  411. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  412. maxframe/tensor/special/ellip_harm.py +55 -0
  413. maxframe/tensor/special/err_fresnel.py +223 -0
  414. maxframe/tensor/special/gamma_funcs.py +303 -0
  415. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  416. maxframe/tensor/special/info_theory.py +189 -0
  417. maxframe/tensor/special/misc.py +21 -0
  418. maxframe/tensor/statistics/__init__.py +6 -0
  419. maxframe/tensor/statistics/corrcoef.py +77 -0
  420. maxframe/tensor/statistics/cov.py +222 -0
  421. maxframe/tensor/statistics/digitize.py +126 -0
  422. maxframe/tensor/statistics/histogram.py +520 -0
  423. maxframe/tensor/statistics/median.py +85 -0
  424. maxframe/tensor/statistics/ptp.py +89 -0
  425. maxframe/tensor/utils.py +3 -3
  426. maxframe/tests/test_udf.py +61 -0
  427. maxframe/tests/test_utils.py +51 -6
  428. maxframe/tests/utils.py +0 -2
  429. maxframe/typing_.py +2 -0
  430. maxframe/udf.py +130 -9
  431. maxframe/utils.py +254 -27
  432. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
  433. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
  434. maxframe_client/fetcher.py +35 -4
  435. maxframe_client/session/odps.py +7 -2
  436. maxframe_client/session/task.py +8 -1
  437. maxframe_client/tests/test_fetcher.py +76 -3
  438. maxframe_client/tests/test_session.py +28 -1
  439. maxframe/dataframe/arrays.py +0 -864
  440. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  441. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  442. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
  443. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,85 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from .split import split
16
+
17
+
18
+ def hsplit(a, indices_or_sections):
19
+ """
20
+ Split a tensor into multiple sub-tensors horizontally (column-wise).
21
+
22
+ Please refer to the `split` documentation. `hsplit` is equivalent
23
+ to `split` with ``axis=1``, the tensor is always split along the second
24
+ axis regardless of the tensor dimension.
25
+
26
+ See Also
27
+ --------
28
+ split : Split an array into multiple sub-arrays of equal size.
29
+
30
+ Examples
31
+ --------
32
+ >>> import maxframe.tensor as mt
33
+
34
+ >>> x = mt.arange(16.0).reshape(4, 4)
35
+ >>> x.execute()
36
+ array([[ 0., 1., 2., 3.],
37
+ [ 4., 5., 6., 7.],
38
+ [ 8., 9., 10., 11.],
39
+ [ 12., 13., 14., 15.]])
40
+ >>> mt.hsplit(x, 2).execute()
41
+ [array([[ 0., 1.],
42
+ [ 4., 5.],
43
+ [ 8., 9.],
44
+ [ 12., 13.]]),
45
+ array([[ 2., 3.],
46
+ [ 6., 7.],
47
+ [ 10., 11.],
48
+ [ 14., 15.]])]
49
+ >>> mt.hsplit(x, mt.array([3, 6])).execute()
50
+ [array([[ 0., 1., 2.],
51
+ [ 4., 5., 6.],
52
+ [ 8., 9., 10.],
53
+ [ 12., 13., 14.]]),
54
+ array([[ 3.],
55
+ [ 7.],
56
+ [ 11.],
57
+ [ 15.]]),
58
+ array([], dtype=float64)]
59
+
60
+ With a higher dimensional array the split is still along the second axis.
61
+
62
+ >>> x = mt.arange(8.0).reshape(2, 2, 2)
63
+ >>> x.execute()
64
+ array([[[ 0., 1.],
65
+ [ 2., 3.]],
66
+ [[ 4., 5.],
67
+ [ 6., 7.]]])
68
+ >>> mt.hsplit(x, 2)
69
+ [array([[[ 0., 1.]],
70
+ [[ 4., 5.]]]),
71
+ array([[[ 2., 3.]],
72
+ [[ 6., 7.]]])]
73
+
74
+ """
75
+ from ..datasource import tensor as astensor
76
+
77
+ ary = a
78
+ a = astensor(a)
79
+
80
+ if a.ndim == 0:
81
+ raise ValueError("hsplit only works on tensors of 1 or more dimensions")
82
+ if a.ndim > 1:
83
+ return split(ary, indices_or_sections, 1)
84
+ else:
85
+ return split(ary, indices_or_sections, 0)
@@ -0,0 +1,139 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import List
16
+
17
+ from ... import opcodes
18
+ from ...core import ENTITY_TYPE, EntityData
19
+ from ...serialization.serializables import AnyField, Int32Field, TupleField
20
+ from ..operators import TensorHasInput, TensorOperatorMixin
21
+ from ..utils import calc_object_length, filter_inputs, validate_axis
22
+
23
+
24
+ class TensorInsert(TensorHasInput, TensorOperatorMixin):
25
+ _op_type_ = opcodes.INSERT
26
+
27
+ index_obj = AnyField("index_obj", default=None)
28
+ values = AnyField("values", default=None)
29
+ axis = Int32Field("axis", default=None)
30
+
31
+ # for chunk
32
+ range_on_axis = TupleField("range_on_axis", default=None)
33
+
34
+ @classmethod
35
+ def _set_inputs(cls, op: "TensorInsert", inputs: List[EntityData]):
36
+ super()._set_inputs(op, inputs)
37
+ inputs_iter = iter(inputs[1:])
38
+ if isinstance(op.index_obj, ENTITY_TYPE):
39
+ op.index_obj = next(inputs_iter)
40
+ if isinstance(op.values, ENTITY_TYPE):
41
+ op.values = next(inputs_iter)
42
+
43
+ def __call__(self, arr, obj, values, shape):
44
+ return self.new_tensor(
45
+ filter_inputs([arr, obj, values]), shape=shape, order=arr.order
46
+ )
47
+
48
+
49
+ def insert(arr, obj, values, axis=None):
50
+ """
51
+ Insert values along the given axis before the given indices.
52
+
53
+ Parameters
54
+ ----------
55
+ arr : array like
56
+ Input array.
57
+ obj : int, slice or sequence of ints
58
+ Object that defines the index or indices before which `values` is
59
+ inserted.
60
+ values : array_like
61
+ Values to insert into `arr`. If the type of `values` is different
62
+ from that of `arr`, `values` is converted to the type of `arr`.
63
+ `values` should be shaped so that ``arr[...,obj,...] = values``
64
+ is legal.
65
+ axis : int, optional
66
+ Axis along which to insert `values`. If `axis` is None then `arr`
67
+ is flattened first.
68
+ Returns
69
+ -------
70
+ out : ndarray
71
+ A copy of `arr` with `values` inserted. Note that `insert`
72
+ does not occur in-place: a new array is returned. If
73
+ `axis` is None, `out` is a flattened array.
74
+ See Also
75
+ --------
76
+ append : Append elements at the end of an array.
77
+ concatenate : Join a sequence of arrays along an existing axis.
78
+ delete : Delete elements from an array.
79
+ Notes
80
+ -----
81
+ Note that for higher dimensional inserts `obj=0` behaves very different
82
+ from `obj=[0]` just like `arr[:,0,:] = values` is different from
83
+ `arr[:,[0],:] = values`.
84
+ Examples
85
+ --------
86
+ >>> import maxframe.tensor as mt
87
+ >>> a = mt.array([[1, 1], [2, 2], [3, 3]])
88
+ >>> a.execute()
89
+ array([[1, 1],
90
+ [2, 2],
91
+ [3, 3]])
92
+ >>> mt.insert(a, 1, 5).execute()
93
+ array([1, 5, 1, ..., 2, 3, 3])
94
+ >>> mt.insert(a, 1, 5, axis=1).execute()
95
+ array([[1, 5, 1],
96
+ [2, 5, 2],
97
+ [3, 5, 3]])
98
+ Difference between sequence and scalars:
99
+ >>> mt.insert(a, [1], [[1],[2],[3]], axis=1).execute()
100
+ array([[1, 1, 1],
101
+ [2, 2, 2],
102
+ [3, 3, 3]])
103
+ >>> b = a.flatten()
104
+ >>> b.execute()
105
+ array([1, 1, 2, 2, 3, 3])
106
+ >>> mt.insert(b, [2, 2], [5, 6]).execute()
107
+ array([1, 1, 5, ..., 2, 3, 3])
108
+ >>> mt.insert(b, slice(2, 4), [5, 6]).execute()
109
+ array([1, 1, 5, ..., 2, 3, 3])
110
+ >>> mt.insert(b, [2, 2], [7.13, False]).execute() # type casting
111
+ array([1, 1, 7, ..., 2, 3, 3])
112
+ >>> x = mt.arange(8).reshape(2, 4)
113
+ >>> idx = (1, 3)
114
+ >>> mt.insert(x, idx, 999, axis=1).execute()
115
+ array([[ 0, 999, 1, 2, 999, 3],
116
+ [ 4, 999, 5, 6, 999, 7]])
117
+ """
118
+ from ..datasource import tensor as astensor
119
+
120
+ arr = astensor(arr)
121
+ if getattr(obj, "ndim", 0) > 1: # pragma: no cover
122
+ raise ValueError(
123
+ "index array argument obj to insert must be one dimensional or scalar"
124
+ )
125
+
126
+ if axis is None:
127
+ # if axis is None, array will be flatten
128
+ arr_size = arr.size
129
+ idx_length = calc_object_length(obj, size=arr_size)
130
+ shape = (arr_size + idx_length,)
131
+ else:
132
+ validate_axis(arr.ndim, axis)
133
+ idx_length = calc_object_length(obj, size=arr.shape[axis])
134
+ shape = tuple(
135
+ s + idx_length if i == axis else s for i, s in enumerate(arr.shape)
136
+ )
137
+
138
+ op = TensorInsert(index_obj=obj, values=values, axis=axis, dtype=arr.dtype)
139
+ return op(arr, obj, values, shape)
@@ -0,0 +1,83 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from ..datasource import tensor as astensor
16
+ from ..utils import normalize_axis_tuple
17
+ from .transpose import transpose
18
+
19
+
20
+ def moveaxis(a, source, destination):
21
+ """
22
+ Move axes of a tensor to new positions.
23
+
24
+ Other axes remain in their original order.
25
+
26
+ Parameters
27
+ ----------
28
+ a : Tensor
29
+ The tensor whose axes should be reordered.
30
+ source : int or sequence of int
31
+ Original positions of the axes to move. These must be unique.
32
+ destination : int or sequence of int
33
+ Destination positions for each of the original axes. These must also be
34
+ unique.
35
+
36
+ Returns
37
+ -------
38
+ result : Tensor
39
+ Array with moved axes. This tensor is a view of the input tensor.
40
+
41
+ See Also
42
+ --------
43
+ transpose: Permute the dimensions of an array.
44
+ swapaxes: Interchange two axes of an array.
45
+
46
+ Examples
47
+ --------
48
+ >>> import maxframe.tensor as mt
49
+
50
+ >>> x = mt.zeros((3, 4, 5))
51
+ >>> mt.moveaxis(x, 0, -1).shape
52
+ (4, 5, 3)
53
+ >>> mt.moveaxis(x, -1, 0).shape
54
+ (5, 3, 4),
55
+
56
+ These all achieve the same result:
57
+
58
+ >>> mt.transpose(x).shape
59
+ (5, 4, 3)
60
+ >>> mt.swapaxes(x, 0, -1).shape
61
+ (5, 4, 3)
62
+ >>> mt.moveaxis(x, [0, 1], [-1, -2]).shape
63
+ (5, 4, 3)
64
+ >>> mt.moveaxis(x, [0, 1, 2], [-1, -2, -3]).shape
65
+ (5, 4, 3)
66
+
67
+ """
68
+ a = astensor(a)
69
+
70
+ source = normalize_axis_tuple(source, a.ndim, "source")
71
+ destination = normalize_axis_tuple(destination, a.ndim, "destination")
72
+ if len(source) != len(destination):
73
+ raise ValueError(
74
+ "`source` and `destination` arguments must have "
75
+ "the same number of elements"
76
+ )
77
+
78
+ order = [n for n in range(a.ndim) if n not in source]
79
+
80
+ for dest, src in sorted(zip(destination, source)):
81
+ order.insert(dest, src)
82
+
83
+ return transpose(a, order)
@@ -0,0 +1,88 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+
17
+
18
+ def result_type(*tensors_and_dtypes):
19
+ """
20
+ Returns the type that results from applying the NumPy
21
+ type promotion rules to the arguments.
22
+
23
+ Type promotion in MaxFrame works similarly to the rules in languages
24
+ like C++, with some slight differences. When both scalars and
25
+ arrays are used, the array's type takes precedence and the actual value
26
+ of the scalar is taken into account.
27
+
28
+ For example, calculating 3*a, where a is an array of 32-bit floats,
29
+ intuitively should result in a 32-bit float output. If the 3 is a
30
+ 32-bit integer, the NumPy rules indicate it can't convert losslessly
31
+ into a 32-bit float, so a 64-bit float should be the result type.
32
+ By examining the value of the constant, '3', we see that it fits in
33
+ an 8-bit integer, which can be cast losslessly into the 32-bit float.
34
+
35
+ Parameters
36
+ ----------
37
+ tensors_and_dtypes : list of tensors and dtypes
38
+ The operands of some operation whose result type is needed.
39
+
40
+ Returns
41
+ -------
42
+ out : dtype
43
+ The result type.
44
+
45
+ See also
46
+ --------
47
+ dtype, promote_types, min_scalar_type, can_cast
48
+
49
+ Notes
50
+ -----
51
+ The specific algorithm used is as follows.
52
+
53
+ Categories are determined by first checking which of boolean,
54
+ integer (int/uint), or floating point (float/complex) the maximum
55
+ kind of all the arrays and the scalars are.
56
+
57
+ If there are only scalars or the maximum category of the scalars
58
+ is higher than the maximum category of the arrays,
59
+ the data types are combined with :func:`promote_types`
60
+ to produce the return value.
61
+
62
+ Otherwise, `min_scalar_type` is called on each array, and
63
+ the resulting data types are all combined with :func:`promote_types`
64
+ to produce the return value.
65
+
66
+ The set of int values is not a subset of the uint values for types
67
+ with the same number of bits, something not reflected in
68
+ :func:`min_scalar_type`, but handled as a special case in `result_type`.
69
+
70
+ Examples
71
+ --------
72
+ >>> import maxframe.tensor as mt
73
+
74
+ >>> mt.result_type(3, mt.arange(7, dtype='i1'))
75
+ dtype('int8')
76
+
77
+ >>> mt.result_type('i4', 'c8')
78
+ dtype('complex128')
79
+
80
+ >>> mt.result_type(3.0, -2)
81
+ dtype('float64')
82
+ """
83
+ from ..core import Tensor
84
+
85
+ arrays_and_dtypes = [
86
+ a.dtype if isinstance(a, Tensor) else a for a in tensors_and_dtypes
87
+ ]
88
+ return np.result_type(*arrays_and_dtypes)
@@ -0,0 +1,124 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.'
14
+
15
+ from collections.abc import Iterable
16
+
17
+ import numpy as np
18
+
19
+ from ..utils import validate_axis
20
+ from .ravel import ravel
21
+
22
+
23
+ def roll(a, shift, axis=None):
24
+ """
25
+ Roll tensor elements along a given axis.
26
+
27
+ Elements that roll beyond the last position are re-introduced at
28
+ the first.
29
+
30
+ Parameters
31
+ ----------
32
+ a : array_like
33
+ Input tensor.
34
+ shift : int or tuple of ints
35
+ The number of places by which elements are shifted. If a tuple,
36
+ then `axis` must be a tuple of the same size, and each of the
37
+ given axes is shifted by the corresponding number. If an int
38
+ while `axis` is a tuple of ints, then the same value is used for
39
+ all given axes.
40
+ axis : int or tuple of ints, optional
41
+ Axis or axes along which elements are shifted. By default, the
42
+ tensor is flattened before shifting, after which the original
43
+ shape is restored.
44
+
45
+ Returns
46
+ -------
47
+ res : Tensor
48
+ Output tensor, with the same shape as `a`.
49
+
50
+ See Also
51
+ --------
52
+ rollaxis : Roll the specified axis backwards, until it lies in a
53
+ given position.
54
+
55
+ Notes
56
+ -----
57
+
58
+ Supports rolling over multiple dimensions simultaneously.
59
+
60
+ Examples
61
+ --------
62
+ >>> import maxframe.tensor as mt
63
+
64
+ >>> x = mt.arange(10)
65
+ >>> mt.roll(x, 2).execute()
66
+ array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
67
+
68
+ >>> x2 = mt.reshape(x, (2,5))
69
+ >>> x2.execute()
70
+ array([[0, 1, 2, 3, 4],
71
+ [5, 6, 7, 8, 9]])
72
+ >>> mt.roll(x2, 1).execute()
73
+ array([[9, 0, 1, 2, 3],
74
+ [4, 5, 6, 7, 8]])
75
+ >>> mt.roll(x2, 1, axis=0).execute()
76
+ array([[5, 6, 7, 8, 9],
77
+ [0, 1, 2, 3, 4]])
78
+ >>> mt.roll(x2, 1, axis=1).execute()
79
+ array([[4, 0, 1, 2, 3],
80
+ [9, 5, 6, 7, 8]])
81
+
82
+ """
83
+ from ..datasource import tensor as astensor
84
+ from ..merge import concatenate
85
+
86
+ a = astensor(a)
87
+ raw = a
88
+
89
+ if axis is None:
90
+ a = ravel(a)
91
+ axis = 0
92
+
93
+ if not isinstance(shift, Iterable):
94
+ shift = (shift,)
95
+ else:
96
+ shift = tuple(shift)
97
+ if not isinstance(axis, Iterable):
98
+ axis = (axis,)
99
+ else:
100
+ axis = tuple(axis)
101
+
102
+ for ax in axis:
103
+ validate_axis(a.ndim, ax)
104
+ broadcasted = np.broadcast(shift, axis)
105
+ if broadcasted.ndim > 1:
106
+ raise ValueError("'shift' and 'axis' should be scalars or 1D sequences")
107
+
108
+ shifts = {ax: 0 for ax in range(a.ndim)}
109
+ for s, ax in broadcasted:
110
+ shifts[ax] += s
111
+
112
+ for ax, s in shifts.items():
113
+ if s == 0:
114
+ continue
115
+
116
+ s = -s
117
+ s %= a.shape[ax]
118
+
119
+ slc1 = (slice(None),) * ax + (slice(s, None),)
120
+ slc2 = (slice(None),) * ax + (slice(s),)
121
+
122
+ a = concatenate([a[slc1], a[slc2]], axis=ax)
123
+
124
+ return a.reshape(raw.shape)
@@ -0,0 +1,77 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+
17
+ from ..utils import validate_axis
18
+
19
+
20
+ def rollaxis(tensor, axis, start=0):
21
+ """
22
+ Roll the specified axis backwards, until it lies in a given position.
23
+
24
+ This function continues to be supported for backward compatibility, but you
25
+ should prefer `moveaxis`.
26
+
27
+ Parameters
28
+ ----------
29
+ a : Tensor
30
+ Input tensor.
31
+ axis : int
32
+ The axis to roll backwards. The positions of the other axes do not
33
+ change relative to one another.
34
+ start : int, optional
35
+ The axis is rolled until it lies before this position. The default,
36
+ 0, results in a "complete" roll.
37
+
38
+ Returns
39
+ -------
40
+ res : Tensor
41
+ a view of `a` is always returned.
42
+
43
+ See Also
44
+ --------
45
+ moveaxis : Move array axes to new positions.
46
+ roll : Roll the elements of an array by a number of positions along a
47
+ given axis.
48
+
49
+ Examples
50
+ --------
51
+ >>> import maxframe.tensor as mt
52
+
53
+ >>> a = mt.ones((3,4,5,6))
54
+ >>> mt.rollaxis(a, 3, 1).shape
55
+ (3, 6, 4, 5)
56
+ >>> mt.rollaxis(a, 2).shape
57
+ (5, 3, 4, 6)
58
+ >>> mt.rollaxis(a, 1, 4).shape
59
+ (3, 5, 6, 4)
60
+
61
+ """
62
+ n = tensor.ndim
63
+ axis = validate_axis(n, axis)
64
+ if start < 0:
65
+ start += n
66
+ msg = "'%s' arg requires %d <= %s < %d, but %d was passed in"
67
+ if not (0 <= start < n + 1):
68
+ raise np.AxisError(msg % ("start", -n, "start", n + 1, start))
69
+ if axis < start:
70
+ # it's been removed
71
+ start -= 1
72
+ if axis == start:
73
+ return tensor
74
+ axes = list(range(0, n))
75
+ axes.remove(axis)
76
+ axes.insert(start, axis)
77
+ return tensor.transpose(axes)
@@ -0,0 +1,89 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+
17
+ from ... import opcodes
18
+ from ...core import ExecutableTuple
19
+ from ...serialization.serializables import Int32Field
20
+ from ..core import TensorOrder
21
+ from ..datasource import tensor as astensor
22
+ from ..operators import TensorOperator, TensorOperatorMixin
23
+
24
+
25
+ class TensorGetShape(TensorOperator, TensorOperatorMixin):
26
+ _op_type_ = opcodes.GET_SHAPE
27
+
28
+ ndim = Int32Field("ndim")
29
+
30
+ def __init__(self, pure_depends=None, **kw):
31
+ super().__init__(_pure_depends=pure_depends, **kw)
32
+
33
+ @property
34
+ def output_limit(self):
35
+ return self.ndim
36
+
37
+ def __call__(self, a):
38
+ if not np.isnan(a.size):
39
+ return ExecutableTuple([astensor(s) for s in a.shape])
40
+
41
+ kws = []
42
+ for i in range(self.output_limit):
43
+ kws.append(
44
+ {
45
+ "shape": (),
46
+ "dtype": np.dtype(np.intc),
47
+ "order": TensorOrder.C_ORDER,
48
+ "i": i,
49
+ }
50
+ )
51
+ return ExecutableTuple(self.new_tensors([a], kws=kws))
52
+
53
+
54
+ def shape(a):
55
+ """
56
+ Return the shape of a tensor.
57
+
58
+ Parameters
59
+ ----------
60
+ a : array_like
61
+ Input tensor.
62
+
63
+ Returns
64
+ -------
65
+ shape : ExecutableTuple of tensors
66
+ The elements of the shape tuple give the lengths of the
67
+ corresponding array dimensions.
68
+
69
+ Examples
70
+ --------
71
+ >>> import maxframe.tensor as mt
72
+
73
+ >>> mt.shape(mt.eye(3)).execute()
74
+ (3, 3)
75
+ >>> mt.shape([[1, 2]]).execute()
76
+ (1, 2)
77
+ >>> mt.shape([0]).execute()
78
+ (1,)
79
+ >>> mt.shape(0).execute()
80
+ ()
81
+
82
+ >>> a = mt.array([(1, 2), (3, 4)], dtype=[('x', 'i4'), ('y', 'i4')])
83
+ >>> mt.shape(a).execute()
84
+ (2,)
85
+
86
+ """
87
+ a = astensor(a)
88
+ op = TensorGetShape(ndim=a.ndim)
89
+ return op(a)