PageSourceSearch

https://www.szdrblog.info/entry/2023/12/22/233113

html szdrblog.info collected 2026-09-26 17:31:28 UTC 55,988 bytes, 1,504 lines download raw bytes

1<!DOCTYPE html>
2<html
3  lang="ja"
4
5
6data-admin-domain="//blog.hatena.ne.jp"
7data-admin-origin="https://blog.hatena.ne.jp"
8data-author="sz_dr"
9data-avail-langs="ja en"
10data-blog="szdr.hatenablog.com"
11data-blog-host="szdr.hatenablog.com"
12data-blog-is-public="1"
13data-blog-name="人間だったら考えて"
14data-blog-owner="sz_dr"
15data-blog-show-ads=""
16data-blog-show-sleeping-ads=""
17data-blog-uri="https://www.szdrblog.info/"
18data-blog-uuid="6653812171400722341"
19data-blogs-uri-base="https://www.szdrblog.info"
20data-brand="pro"
21data-data-layer="{&quot;hatenablog&quot;:{&quot;admin&quot;:{},&quot;analytics&quot;:{&quot;brand_property_id&quot;:&quot;&quot;,&quot;measurement_id&quot;:&quot;&quot;,&quot;non_sampling_property_id&quot;:&quot;&quot;,&quot;property_id&quot;:&quot;UA-161438189-1&quot;,&quot;separated_property_id&quot;:&quot;UA-29716941-21&quot;},&quot;blog&quot;:{&quot;blog_id&quot;:&quot;6653812171400722341&quot;,&quot;content_seems_japanese&quot;:&quot;true&quot;,&quot;disable_ads&quot;:&quot;custom_domain&quot;,&quot;enable_ads&quot;:&quot;false&quot;,&quot;entry_show_footer_related_entries&quot;:&quot;true&quot;,&quot;force_pc_view&quot;:&quot;false&quot;,&quot;is_public&quot;:&quot;true&quot;,&quot;is_responsive_view&quot;:&quot;false&quot;,&quot;is_sleeping&quot;:&quot;true&quot;,&quot;lang&quot;:&quot;ja&quot;,&quot;name&quot;:&quot;\u4eba\u9593\u3060\u3063\u305f\u3089\u8003\u3048\u3066&quot;,&quot;owner_name&quot;:&quot;sz_dr&quot;,&quot;uri&quot;:&quot;https://www.szdrblog.info/&quot;},&quot;brand&quot;:&quot;pro&quot;,&quot;page_id&quot;:&quot;entry&quot;,&quot;permalink_entry&quot;:{&quot;author_name&quot;:&quot;sz_dr&quot;,&quot;categories&quot;:&quot;Python&quot;,&quot;character_count&quot;:3055,&quot;date&quot;:&quot;2023-12-22&quot;,&quot;entry_id&quot;:&quot;6801883189068880610&quot;,&quot;first_category&quot;:&quot;Python&quot;,&quot;hour&quot;:&quot;23&quot;,&quot;title&quot;:&quot;numpy.typing.NDArray\u306e\u6574\u7406&quot;,&quot;uri&quot;:&quot;https://www.szdrblog.info/entry/2023/12/22/233113&quot;},&quot;pro&quot;:&quot;pro&quot;,&quot;router_type&quot;:&quot;blogs&quot;}}"
22data-device="pc"
23data-dont-recommend-pro="false"
24data-global-domain="https://hatena.blog"
25data-globalheader-color="b"
26data-globalheader-type="pc"
27data-has-touch-view="1"
28data-help-url="https://help.hatenablog.com"
29data-page="entry"
30data-parts-domain="https://hatenablog-parts.com"
31data-plus-available="1"
32data-pro="true"
33data-router-type="blogs"
34data-sentry-dsn="https://[email protected]/1195218"
35data-sentry-environment="production"
36data-sentry-sample-rate="0.1"
37data-show-heading-anchor-link="1"
38data-static-domain="https://cdn.blog.st-hatena.com"
39data-version="6810a7f5d0766c84edfe3b435c3a2e"
40
41
42
43
44
45
46  data-initial-state="{}"
47
48  >
49  <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">
50
51  
52
53  
54  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
55
56
57  
58
59
60  
61
62  <meta name="robots" content="max-image-preview:large" />
63
64
65  <meta charset="utf-8"/>
66  <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" />
67  <title>numpy.typing.NDArrayの整理 - 人間だったら考えて</title>
68
69  
70  <link rel="canonical" href="https://www.szdrblog.info/entry/2023/12/22/233113"/>
71
72
73
74  
75
76<meta itemprop="name" content="numpy.typing.NDArrayの整理 - 人間だったら考えて"/>
77
78  <meta itemprop="image" content="https://cdn.image.st-hatena.com/image/scale/f7675cad2e068781cd1363e68335f34bffe7e73f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.blog.st-hatena.com%2Fimages%2Ftheme%2Fog-image-1500.png"/>
79
80
81  <meta property="og:title" content="numpy.typing.NDArrayの整理 - 人間だったら考えて"/>
82<meta property="og:type" content="article"/>
83  <meta property="og:url" content="https://www.szdrblog.info/entry/2023/12/22/233113"/>
84
85  <meta property="og:image" content="https://cdn.image.st-hatena.com/image/scale/f7675cad2e068781cd1363e68335f34bffe7e73f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.blog.st-hatena.com%2Fimages%2Ftheme%2Fog-image-1500.png"/>
86
87<meta property="og:image:alt" content="numpy.typing.NDArrayの整理 - 人間だったら考えて"/>
88    <meta property="og:description" content="概要 numpy.typing.NDArrayとは何か NDArrayを利用した型アノテーション まとめ 概要 numpy version=1.20からnumpy.typingが提供されています。 numpy.org 型アノテーションを記述する際に、numpy.ndarrayで指定するのと、numpy.typing.NDArrayで指定するのは何が違うのかを整理します。 numpy.typing.NDArrayとは何か Typing (numpy.typing) — NumPy v1.26 Manualによると、 A generic version of np.ndarray[Any, np.…" />
89<meta property="og:site_name" content="人間だったら考えて"/>
90
91  <meta property="article:published_time" content="2023-12-22T14:31:13Z" />
92
93    <meta property="article:tag" content="Python" />
94      <meta name="twitter:card"  content="summary_large_image" />
95    <meta name="twitter:image" content="https://cdn.image.st-hatena.com/image/scale/f7675cad2e068781cd1363e68335f34bffe7e73f/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.blog.st-hatena.com%2Fimages%2Ftheme%2Fog-image-1500.png" />  <meta name="twitter:title" content="numpy.typing.NDArrayの整理 - 人間だったら考えて" />    <meta name="twitter:description" content="概要 numpy.typing.NDArrayとは何か NDArrayを利用した型アノテーション まとめ 概要 numpy version=1.20からnumpy.typingが提供されています。 numpy.org 型アノテーションを記述する際に、numpy.ndarrayで指定するのと、numpy.typing.N…" />  <meta name="twitter:app:name:iphone" content="はてなブログアプリ" />
96  <meta name="twitter:app:id:iphone" content="583299321" />
97  <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fwww.szdrblog.info%2Fentry%2F2023%2F12%2F22%2F233113" />  <meta name="twitter:site" content="@sz_dr" />
98  
99    <meta name="description" content="概要 numpy.typing.NDArrayとは何か NDArrayを利用した型アノテーション まとめ 概要 numpy version=1.20からnumpy.typingが提供されています。 numpy.org 型アノテーションを記述する際に、numpy.ndarrayで指定するのと、numpy.typing.NDArrayで指定するのは何が違うのかを整理します。 numpy.typing.NDArrayとは何か Typing (numpy.typing) — NumPy v1.26 Manualによると、 A generic version of np.ndarray[Any, np.…" />
100
101
102  
103<script
104  id="embed-gtm-data-layer-loader"
105  data-data-layer-page-specific="{&quot;hatenablog&quot;:{&quot;blogs_permalink&quot;:{&quot;entry_afc_issued&quot;:&quot;false&quot;,&quot;blog_afc_issued&quot;:&quot;false&quot;,&quot;is_blog_sleeping&quot;:&quot;true&quot;,&quot;has_related_entries_with_elasticsearch&quot;:&quot;true&quot;,&quot;is_author_pro&quot;:&quot;true&quot;}}}"
106>
107(function() {
108  function loadDataLayer(elem, attrName) {
109    if (!elem) { return {}; }
110    var json = elem.getAttribute(attrName);
111    if (!json) { return {}; }
112    return JSON.parse(json);
113  }
114
115  var globalVariables = loadDataLayer(
116    document.documentElement,
117    'data-data-layer'
118  );
119  var pageSpecificVariables = loadDataLayer(
120    document.getElementById('embed-gtm-data-layer-loader'),
121    'data-data-layer-page-specific'
122  );
123
124  var variables = [globalVariables, pageSpecificVariables];
125
126  if (!window.dataLayer) {
127    window.dataLayer = [];
128  }
129
130  for (var i = 0; i < variables.length; i++) {
131    window.dataLayer.push(variables[i]);
132  }
133})();
134</script>
134
135
136<!-- Google Tag Manager -->
137<script>
vendor: 327 bytes, lines 137-141
137(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
138new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
139j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
140'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
141})(window,document,'script','dataLayer','
141GTM-P4CXTW
vendor: 3 bytes, line 141
141');
141</script>
141
142<!-- End Google Tag Manager -->
143
144
145
146
147
148
149
150
151
152
153
154  <link rel="shortcut icon" href="https://www.szdrblog.info/icon/favicon">
155<link rel="apple-touch-icon" href="https://www.szdrblog.info/icon/touch">
156<link rel="icon" sizes="192x192" href="https://www.szdrblog.info/icon/link">
157
158  
159
160<link rel="alternate" type="application/atom+xml" title="Atom" href="https://www.szdrblog.info/feed"/>
161<link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://www.szdrblog.info/rss"/>
162
163  <link rel="alternate" type="application/json+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fwww.szdrblog.info%2Fentry%2F2023%2F12%2F22%2F233113&amp;format=json" title="oEmbed Profile of numpy.typing.NDArrayの整理"/>
164<link rel="alternate" type="text/xml+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fwww.szdrblog.info%2Fentry%2F2023%2F12%2F22%2F233113&amp;format=xml" title="oEmbed Profile of numpy.typing.NDArrayの整理"/>
165  
166  <link rel="author" href="http://www.hatena.ne.jp/sz_dr/">
167
168  
169
170  
171
172
173  
174    
175<link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=6810a7f5d0766c84edfe3b435c3a2e"/>
176
177    
178  <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/6653812171400722341/64ca9dc448cfc4e15f9e18070d53da750b273519"/>
179  
180  
181  
182
183  
184
185  
186<script> </script>
186
187
188  
189<style>
190  div#google_afc_user,
191  div.google-afc-user-container,
192  div.google_afc_image,
193  div.google_afc_blocklink {
194      display: block !important;
195  }
196</style>
197
198
199  
200
201  
202    
202<script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","dateModified":"2023-12-22T23:31:13+09:00","datePublished":"2023-12-22T23:31:13+09:00","description":"概要 numpy.typing.NDArrayとは何か NDArrayを利用した型アノテーション まとめ 概要 numpy version=1.20からnumpy.typingが提供されています。 numpy.org 型アノテーションを記述する際に、numpy.ndarrayで指定するのと、numpy.typing.NDArrayで指定するのは何が違うのかを整理します。 numpy.typing.NDArrayとは何か Typing (numpy.typing) — NumPy v1.26 Manualによると、 A generic version of np.ndarray[Any, np.…","headline":"numpy.typing.NDArrayの整理","image":["https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png"],"mainEntityOfPage":{"@id":"https://www.szdrblog.info/entry/2023/12/22/233113","@type":"WebPage"}}</script>
202
203
204  
205
206  
206<script data-ad-client="ca-pub-9447475547516717" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
206
207<meta name="google-site-verification" content="nA6semdRFgBIH116ZU8DIOtUV0Ri2PbisLFvmHfNBcU" />
208
209  
210
211</head>
212
213  <body class="page-entry category-Python globalheader-ng-enabled">
214    
215    
216
217<div id="globalheader-container"
218  data-brand="hatenablog"
219  
220  >
221  <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe>
222</div>
223
224
225  
226  
227  
228    <nav class="
229      blog-controlls
230      
231    ">
232      <div class="blog-controlls-blog-icon">
233        <a href="https://www.szdrblog.info/">
234          <img src="https://cdn.image.st-hatena.com/image/square/2add95f3d3869dbec2cf4c52d706c470c1a3367b/backend=imagemagick;height=128;version=1;width=128/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fcustom_blog_icon%2F107076361%2F1514243901786506" alt="人間だったら考えて"/>
235        </a>
236      </div>
237      <div class="blog-controlls-title">
238        <a href="https://www.szdrblog.info/">人間だったら考えて</a>
239      </div>
240      <a href="https://blog.hatena.ne.jp/sz_dr/szdr.hatenablog.com/subscribe?utm_source=blogs_topright_button&amp;utm_medium=button&amp;utm_campaign=subscribe_blog" class="blog-controlls-subscribe-btn test-blog-header-controlls-subscribe">
241        読者になる
242      </a>
243    </nav>
244  
245
246  <div id="container">
247    <div id="container-inner">
248      <header id="blog-title" data-brand="hatenablog">
249  <div id="blog-title-inner" >
250    <div id="blog-title-content">
251      <h1 id="title"><a href="https://www.szdrblog.info/">人間だったら考えて</a></h1>
252      
253    </div>
254  </div>
255</header>
256
257      
258
259
260      
261          <div id="top-box">
262    <div class="breadcrumb" data-test-id="breadcrumb">
263      <div class="breadcrumb-inner">
264        <a class="breadcrumb-link" href="https://www.szdrblog.info/"><span>トップ</span></a>          <span class="breadcrumb-gt">&gt;</span>          <span class="breadcrumb-child">            <a class="breadcrumb-child-link" href="https://www.szdrblog.info/archive/category/Python"><span>Python</span></a>          </span>            <span class="breadcrumb-gt">&gt;</span>          <span class="breadcrumb-child">            <span>numpy.typing.NDArrayの整理</span>          </span>      </div>
265    </div>
266  </div>
267  
267<script type="application/ld+json" class="test-breadcrumb-json-ld">
268    {"itemListElement":[{"item":{"name":"トップ","@id":"https://www.szdrblog.info/"},"position":1,"@type":"ListItem"},{"@type":"ListItem","position":2,"item":{"@id":"https://www.szdrblog.info/archive/category/Python","name":"Python"}}],"@type":"BreadcrumbList","@context":"http://schema.org"}
269  </script>
269
270      
271      
272
273
274
275
276<div id="content" class="hfeed"
277  
278  >
279  <div id="content-inner">
280    <div id="wrapper">
281      <div id="main">
282        <div id="main-inner">
283          
284
285          
286
287
288
289          
290  
291  <!-- google_ad_section_start -->
292  <!-- rakuten_ad_target_begin -->
293  
294  
295  
296
297  
298
299  
300    
301      
302        <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-3200 words-400 mode-markdown entry-odd" id="entry-6801883189068880610" data-keyword-campaign="" data-uuid="6801883189068880610" data-publication-type="entry">
303  <div class="entry-inner">
304    <header class="entry-header">
305  
306    <div class="date entry-date first">
307    <a href="https://www.szdrblog.info/archive/2023/12/22" rel="nofollow">
308      <time datetime="2023-12-22T14:31:13Z" title="2023-12-22T14:31:13Z">
309        <span class="date-year">2023</span><span class="hyphen">-</span><span class="date-month">12</span><span class="hyphen">-</span><span class="date-day">22</span>
310      </time>
311    </a>
312      </div>
313  <h1 class="entry-title">
314  <a href="https://www.szdrblog.info/entry/2023/12/22/233113" class="entry-title-link bookmark">numpy.typing.NDArrayの整理</a>
315</h1>
316
317  
318  
319
320  <div class="entry-categories categories">
321    
322    <a href="https://www.szdrblog.info/archive/category/Python" class="entry-category-link category-Python">Python</a>
323    
324  </div>
325
326
327  
328
329  
330
331</header>
332
333    
334
335
336    <div class="entry-content hatenablog-entry">
337  
338    <ul class="table-of-contents">
339    <li><a href="#概要">概要</a></li>
340    <li><a href="#numpytypingNDArrayとは何か">numpy.typing.NDArrayとは何か</a></li>
341    <li><a href="#NDArrayを利用した型アノテーション">NDArrayを利用した型アノテーション</a></li>
342    <li><a href="#まとめ">まとめ</a></li>
343</ul>
344
345<h1 id="概要">概要</h1>
346
347<p>numpy version=1.20から<code>numpy.typing</code>が提供されています。</p>
348
349<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fnumpy.org%2Fdoc%2Fstable%2Freference%2Ftyping.html" title="Typing (numpy.typing) — NumPy v1.26 Manual" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://numpy.org/doc/stable/reference/typing.html">numpy.org</a></cite></p>
350
351<p>型アノテーションを記述する際に、<code>numpy.ndarray</code>で指定するのと、<code>numpy.typing.NDArray</code>で指定するのは何が違うのかを整理します。</p>
352
353<h1 id="numpytypingNDArrayとは何か">numpy.typing.NDArrayとは何か</h1>
354
355<p><a href="https://numpy.org/doc/stable/reference/typing.html#numpy.typing.NDArray">Typing (numpy.typing) &mdash; NumPy v1.26 Manual</a>によると、</p>
356
357<blockquote><p>A generic version of np.ndarray[Any, np.dtype[+ScalarType]].</p></blockquote>
358
359<p>と記載されています。</p>
360
361<p>numpy==1.26.2における<code>numpy.typing.NDArray</code>の実装を確認してみます。</p>
362
363<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np
364<span class="synPreProc">import</span> numpy.typing <span class="synStatement">as</span> npt
365
366npt.NDArray
367</pre>
368
369
370
371
372<pre class="code lang-python" data-lang="python" data-unlink>numpy.ndarray[typing.Any, numpy.dtype[+_ScalarType_co]]
373</pre>
374
375
376<p><a href="https://github.com/numpy/numpy/blob/v1.26.2/numpy/_typing/_array_like.py#L32">コード上</a>では以下のように実装されています。</p>
377
378<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> numpy <span class="synPreProc">import</span> (
379    ndarray,
380    dtype,
381    generic,
382    ...
383)
384...
385_ScalarType_co = TypeVar(<span class="synConstant">&quot;_ScalarType_co&quot;</span>, bound=generic, covariant=<span class="synIdentifier">True</span>)
386...
387NDArray = ndarray[Any, dtype[_ScalarType_co]]
388</pre>
389
390
391<p><code>numpy.typing.NDArray</code>は<code>ndarray[Any, dtype[_ScalarType_co]]</code>の<a href="https://docs.python.org/ja/3/library/typing.html#type-aliases">型エイリアス</a>ということが分かります。</p>
392
393<p>また、<code>_ScalarType_co</code>は<code>TypeVar("_ScalarType_co", bound=generic, covariant=True)</code>という<a href="https://docs.python.org/ja/3/library/typing.html#typevar">型変数</a>です。</p>
394
395<ul>
396<li><code>bound=generic</code>と指定しています。<a href="https://numpy.org/doc/stable/reference/arrays.scalars.html">Scalars &mdash; NumPy v1.26 Manual</a>
396によると、<code>numpy.generic</code>はnumpyにおけるスカラー型の基底クラスとのことです。<code>_ScalarType_co</code>は<code>numpy.generic</code>の部分型(要はスカラー型)を受け取ります。</li>
397<li><code>covariant=True</code>と指定しています。<code>A</code>が<code>B</code>の部分型の場合、<code>dtype[A]</code>は<code>dtype[B]</code>の部分型と見なされます。</li>
398</ul>
399
400
401<p><code>ndarray[Any, dtype[_ScalarType_co]]</code>という実装について、<code>Any</code>と<code>dtype[_ScalarType_co]]</code>はそれぞれ何に対応しているのかを確認していきます。</p>
402
403<p><a href="https://github.com/numpy/numpy/blob/v1.26.2/numpy/__init__.pyi#L1488">コード上</a>では、<code>ndarray</code>は以下のように定義されています。</p>
404
405<pre class="code lang-python" data-lang="python" data-unlink>_DType_co = TypeVar(<span class="synConstant">&quot;_DType_co&quot;</span>, covariant=<span class="synIdentifier">True</span>, bound=dtype[Any])
406...
407<span class="synComment"># </span><span class="synTodo">TODO</span><span class="synComment">: Set the `bound` to something more suitable once we</span>
408<span class="synComment"># have proper shape support</span>
409_ShapeType = TypeVar(<span class="synConstant">&quot;_ShapeType&quot;</span>, bound=Any)
410...
411<span class="synStatement">class</span> <span class="synIdentifier">ndarray</span>(_ArrayOrScalarCommon, Generic[_ShapeType, _DType_co]):
412    __hash__: ClassVar[<span class="synIdentifier">None</span>]
413...
414</pre>
415
416
417<p><code>_ShapeType</code>は<code>ndarray</code>のshape情報が与えられます。
418ただ、現状の<code>_ShapeType</code>の実装では<code>bound=Any</code>となっているので、<code>Any</code>の部分型(要はなんでも)を受け取れてしまいます。
419TODOコメントにもあるように、shapeチェックができるようになると良いですね。</p>
420
421<p>…というわけで、型アノテーションにおいて2つを以下のように整理しました。</p>
422
423<ul>
424<li><code>ndarray</code>ではShapeTypeとDtypeの2つを指定できる。ただし、現状ShapeTypeには任意の型が渡せてしまう。</li>
425<li><code>NDArray</code>は<code>ndarray[Any, dtype[_ScalarType_co]]</code>と等価。</li>
426</ul>
427
428
429<p>個人的には、型アノテーションがシンプルになることから<code>NDArray</code>を使うのが良いんじゃないかなと思います<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>。</p>
430
431<h1 id="NDArrayを利用した型アノテーション">NDArrayを利用した型アノテーション</h1>
432
433<p>実際に<code>NDArray</code>を使って型アノテーションしてみましょう。</p>
434
435<p>例えば以下のように型アノテーションが可能です。</p>
436
437<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np
438<span class="synPreProc">import</span> numpy.typing <span class="synStatement">as</span> npt
439
440
441<span class="synStatement">def</span> <span class="synIdentifier">add_one</span>(xs: npt.NDArray) -&gt; npt.NDArray:
442    <span class="synStatement">return</span> xs + <span class="synConstant">1</span>
443
444
445xs = np.array([<span class="synConstant">1</span>, <span class="synConstant">2</span>, <span class="synConstant">3</span>])
446add_one(xs)
447</pre>
448
449
450
451
452<pre class="code bash" data-lang="bash" data-unlink>$ mypy exp.py
453
454Success: no issues found in 1 source file</pre>
455
456
457<p>ただし上記では<code>NDArray</code>のdtype部分を指定していないため、<code>mypy --strict</code>もしくは<code>mypy --disallow-any-generics</code>では以下のように怒られます。</p>
458
459<pre class="code" data-lang="" data-unlink>$ mypy --disallow-any-generics exp.py 
460
461exp.py:5: error: Missing type parameters for generic type &#34;npt.NDArray&#34;  [type-arg]
462Found 1 error in 1 file (checked 1 source file)</pre>
463
464
465<p>以下のようにdtypeを指定してあげればOKです。</p>
466
467<pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">add_one</span>(xs: npt.NDArray[np.int32]) -&gt; npt.NDArray[np.int32]:
468    <span class="synStatement">return</span> xs + <span class="synConstant">1</span>
469</pre>
470
471
472<p>誤って<code>NDArray[np.float32]</code>型の値を渡すと、ちゃんとmypyが怒ってくれます。</p>
473
474<pre class="code lang-python" data-lang="python" data-unlink>xs: npt.NDArray[np.float32] = np.array([<span class="synConstant">1</span>, <span class="synConstant">2</span>, <span class="synConstant">3</span>])
475add_one(xs)
476</pre>
477
478
479
480
481<pre class="code bash" data-lang="bash" data-unlink>$ mypy --disallow-any-generics exp.py
482exp.py:10: error: Argument 1 to &#34;add_one&#34; has incompatible type &#34;ndarray[Any, dtype[floating[_32Bit]]]&#34;; expected &#34;ndarray[Any, dtype[signedinteger[_32Bit]]]&#34;  [arg-type]
483Found 1 error in 1 file (checked 1 source file)</pre>
484
485
486<h1 id="まとめ">まとめ</h1>
487
488<p><code>numpy.typing.NDArray</code>の実装および使い方について見てきました。</p>
489
490<p>numpy.typingは他にも<code>ArrayLike</code>や<code>DTypeLike</code>などの型を提供しており、うまく使ってあげることで素敵な型アノテーションができそうです。</p>
491<div class="footnotes">
492<hr/>
493<ol>
494<li id="fn:1">
495<a href="https://github.com/ramonhagenaars/nptyping">nptyping</a>では<code>Shape</code>型を提供しており、ShapeTypeを指定した型アノテーションができるようです。メンテナンスは止まっていそうですが、、<a href="#fnref:1" rev="footnote">&#8617;</a></li>
496</ol>
497</div>
498
499
500    
501    
502
503
504
505
506    
507
508  
509</div>
510
511    
512  <footer class="entry-footer">
513    
514    <div class="entry-tags-wrapper">
515  <div class="entry-tags">  </div>
516</div>
517
518    <p class="entry-footer-section track-inview-by-gtm" data-gtm-track-json="{&quot;area&quot;: &quot;finish_reading&quot;}">
519  <span class="author vcard"><span class="fn" data-load-nickname="1" data-user-name="sz_dr" >sz_dr</span></span>
520  <span class="entry-footer-time"><a href="https://www.szdrblog.info/entry/2023/12/22/233113"><time data-relative datetime="2023-12-22T14:31:13Z" title="2023-12-22T14:31:13Z" class="updated">2023-12-22 23:31</time></a></span>
521  
522  
523  
524    <span class="
525      entry-footer-subscribe
526      
527    " data-test-blog-controlls-subscribe>
528      <a href="https://blog.hatena.ne.jp/sz_dr/szdr.hatenablog.com/subscribe?utm_campaign=subscribe_blog&amp;utm_source=blogs_entry_footer&amp;utm_medium=button">
529        読者になる
530      </a>
531    </span>
532  
533</p>
534
535    
536  <div
537    class="hatena-star-container"
538    data-hatena-star-container
539    data-hatena-star-url="https://www.szdrblog.info/entry/2023/12/22/233113"
540    data-hatena-star-title="numpy.typing.NDArrayの整理"
541    data-hatena-star-variant="profile-icon"
542    data-hatena-star-profile-url-template="https://blog.hatena.ne.jp/{username}/"
543  ></div>
544
545
546    
547<div class="social-buttons">
548  
549  
550    <div class="social-button-item">
551      <a href="https://b.hatena.ne.jp/entry/s/www.szdrblog.info/entry/2023/12/22/233113" class="hatena-bookmark-button" data-hatena-bookmark-url="https://www.szdrblog.info/entry/2023/12/22/233113" data-hatena-bookmark-layout="vertical-balloon" data-hatena-bookmark-lang="ja" title="この記事をはてなブックマークに追加"><img src="https://b.st-hatena.com/images/entry-button/button-only.gif" alt="この記事をはてなブックマークに追加" width="20" height="20" style="border: none;" /></a>
552    </div>
553  
554  
555  
556    
557    
558    <div class="social-button-item">
559      <a
560          class="entry-share-button entry-share-button-twitter test-share-button-twitter"
561          href="https://x.com/intent/tweet?text=numpy.typing.NDArray%E3%81%AE%E6%95%B4%E7%90%86+-+%E4%BA%BA%E9%96%93%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%89%E8%80%83%E3%81%88%E3%81%A6&amp;url=https%3A%2F%2Fwww.szdrblog.info%2Fentry%2F2023%2F12%2F22%2F233113"
562          title="X(Twitter)で投稿する"
563        ></a>
564    </div>
565  
566  
567  
568  
569  
570  
571</div>
572
573    
574
575    <div class="customized-footer">
576      
577
578        
579
580          <div class="entry-footer-modules" id="entry-footer-secondary-modules">      
581<div class="hatena-module hatena-module-related-entries" >
582      
583  <!-- Hatena-Epic-has-related-entries-with-elasticsearch:true -->
584  <div class="hatena-module-title">
585    関連記事
586  </div>
587  <div class="hatena-module-body">
588    <ul class="related-entries hatena-urllist urllist-with-thumbnails">
589  
590  
591    
592    <li class="urllist-item related-entries-item">
593      <div class="urllist-item-inner related-entries-item-inner">
594        
595          
596                      <div class="urllist-date-link related-entries-date-link">
597  <a href="https://www.szdrblog.info/archive/2021/12/04" rel="nofollow">
598    <time datetime="2021-12-03T15:20:41Z" title="2021年12月4日">
599      2021-12-04
600    </time>
601  </a>
602</div>
603
604          <a href="https://www.szdrblog.info/entry/2021/12/04/002041" class="urllist-title-link related-entries-title-link  urllist-title related-entries-title">ちょっとテクい検索ランキングをVespaで実現する</a>
605
606
607
608
609          
610          
611
612                      <div class="urllist-entry-body related-entries-entry-body">この記事は何? Vespaの準備 Vespaにおけるランキングロジック…</div>
613      </div>
614    </li>
615  
616</ul>
617
618  </div>
619</div>
620  </div>
621        
622
623      
624    </div>
625    
626  <div class="comment-box js-comment-box">
627    
628    <ul class="comment js-comment">
629      <li class="read-more-comments" style="display: none;"><a>もっと読む</a></li>
630    </ul>
631    
632      <a class="leave-comment-title js-leave-comment-title">コメントを書く</a>
633    
634  </div>
635
636  </footer>
637
638  </div>
639</article>
640
641      
642      
643    
644  
645
646  
647  <!-- rakuten_ad_target_end -->
648  <!-- google_ad_section_end -->
649  
650  
651  
652  <div class="pager pager-permalink permalink">
653    
654    
655      
656      <span class="pager-next">
657        <a href="https://www.szdrblog.info/entry/2023/12/01/000250" rel="next">
658          Vespaでベクトル検索によるマルチモーダル…
659          <span class="pager-arrow"> &raquo;</span>
660        </a>
661      </span>
662    
663  </div>
664
665
666  
667
668
669
670        </div>
671      </div>
672
673      <aside id="box1">
674  <div id="box1-inner">
675  </div>
676</aside>
677
678    </div><!-- #wrapper -->
679
680    
681<aside id="box2">
682  
683  <div id="box2-inner">
684    
685      
686
687<div class="hatena-module hatena-module-profile">
688  <div class="hatena-module-title">
689    プロフィール
690  </div>
691  <div class="hatena-module-body">
692    
693    <a href="https://www.szdrblog.info/about" class="profile-icon-link">
694      <img src="https://cdn.profile-image.st-hatena.com/users/sz_dr/profile.png?1469010251"
695      alt="id:sz_dr" class="profile-icon" />
696    </a>
697    
698
699    
700
701    
702
703    
704
705    
706      <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box"
707  
708  >
709
710  <a href="#" class="hatena-follow-button js-hatena-follow-button">
711    <span class="subscribing">
712      <span class="foreground">読者です</span>
713      <span class="background">読者をやめる</span>
714    </span>
715    <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once>
716      <span class="foreground">読者になる</span>
717      <span class="background">読者になる</span>
718    </span>
719  </a>
720  <div class="subscription-count-box js-subscription-count-box">
721    <i></i>
722    <u></u>
723    <span class="subscription-count js-subscription-count">
724    </span>
725  </div>
726</div>
727
728    
729
730    
731      <div class="hatena-follow-button-box">
732        <a href="https://x.com/sz_dr" title="X(Twitter)アカウント" class="btn-twitter" data-lang="ja">
733          <img src="https://cdn.blog.st-hatena.com/images/theme/plofile-socialize-x.svg?version=6810a7f5d0766c84edfe3b435c3a2e" alt="X">
734          <span>
735            @sz_drをフォロー
736          </span>
737        </a>
738      </div>
739    
740
741    <div class="profile-about">
742      <a href="https://www.szdrblog.info/about">このブログについて</a>
743    </div>
744
745  </div>
746</div>
747
748    
749      <div class="hatena-module hatena-module-recent-entries ">
750  <div class="hatena-module-title">
751    <a href="https://www.szdrblog.info/archive">
752      最新記事
753    </a>
754  </div>
755  <div class="hatena-module-body">
756    <ul class="recent-entries hatena-urllist ">
757  
758  
759    
760    <li class="urllist-item recent-entries-item">
761      <div class="urllist-item-inner recent-entries-item-inner">
762        
763          
764          
765          <a href="https://www.szdrblog.info/entry/2023/12/22/233113" class="urllist-title-link recent-entries-title-link  urllist-title recent-entries-title">numpy.typing.NDArrayの整理</a>
766
767
768
769
770          
771          
772
773                </div>
774    </li>
775  
776    
777    <li class="urllist-item recent-entries-item">
778      <div class="urllist-item-inner recent-entries-item-inner">
779        
780          
781          
782          <a href="https://www.szdrblog.info/entry/2023/12/01/000250" class="urllist-title-link recent-entries-title-link  urllist-title recent-entries-title">Vespaでベクトル検索によるマルチモーダル検索システムを実装する</a>
783
784
785
786
787          
788          
789
790                </div>
791    </li>
792  
793    
794    <li class="urllist-item recent-entries-item">
795      <div class="urllist-item-inner recent-entries-item-inner">
796        
797          
798          
799          <a href="https://www.szdrblog.info/entry/2023/10/24/184638" class="urllist-title-link recent-entries-title-link  urllist-title recent-entries-title">育児支援ダッシュボードを支える技術</a>
800
801
802
803
804          
805          
806
807                </div>
808    </li>
809  
810    
811    <li class="urllist-item recent-entries-item">
812      <div class="urllist-item-inner recent-entries-item-inner">
813        
814          
815          
816          <a href="https://www.szdrblog.info/entry/2022/12/12/002630" class="urllist-title-link recent-entries-title-link  urllist-title recent-entries-title">VespaのParent/Child(document reference)で検索改善の幅が広がります</a>
817
818
819
820
821          
822          
823
824                </div>
825    </li>
826  
827    
828    <li class="urllist-item recent-entries-item">
829      <div class="urllist-item-inner recent-entries-item-inner">
830        
831          
832          
833          <a href="https://www.szdrblog.info/entry/2021/12/04/002041" class="urllist-title-link recent-entries-title-link  urllist-title recent-entries-title">ちょっとテクい検索ランキングをVespaで実現する</a>
834
835
836
837
838          
839          
840
841                </div>
842    </li>
843  
844</ul>
845
846      </div>
847</div>
848
849    
850      
851<div class="hatena-module hatena-module-related-entries" >
852  
853  <div class="hatena-module-title">
854    関連記事
855  </div>
856  <div class="hatena-module-body">
857    <ul class="related-entries hatena-urllist ">
858  
859  
860    
861    <li class="urllist-item related-entries-item">
862      <div class="urllist-item-inner related-entries-item-inner">
863        
864          
865          
866          <a href="https://www.szdrblog.info/entry/2021/04/05/194006" class="urllist-title-link related-entries-title-link  urllist-title related-entries-title">ライブラリ・アプリケーションでPythonのバージョンを指定したい</a>
867
868
869
870
871          
872          
873
874                </div>
875    </li>
876  
877    
878    <li class="urllist-item related-entries-item">
879      <div class="urllist-item-inner related-entries-item-inner">
880        
881          
882          
883          <a href="https://www.szdrblog.info/entry/2020/08/15/002418" class="urllist-title-link related-entries-title-link  urllist-title related-entries-title">【Python】フィルタを利用してSlackに通知するログを振り分ける</a>
884
885
886
887
888          
889          
890
891                </div>
892    </li>
893  
894    
895    <li class="urllist-item related-entries-item">
896      <div class="urllist-item-inner related-entries-item-inner">
897        
898          
899          
900          <a href="https://www.szdrblog.info/entry/2020/03/21/234314" class="urllist-title-link related-entries-title-link  urllist-title related-entries-title">【Python】Mixinクラスの継承先でインスタンス変数の定義を強制したい</a>
901
902
903
904
905          
906          
907
908                </div>
909    </li>
910  
911</ul>
912
913  </div>
914</div>
915
916    
917      
918<div class="hatena-module hatena-module-entries-access-ranking"
919  data-count="3"
920  data-source="access"
921  data-category_name=""
922  data-enable_customize_format="0"
923  data-display_entry_image_size_width="100"
924  data-display_entry_image_size_height="100"
925
926  data-display_entry_category="0"
927  data-display_entry_image="0"
928  data-display_entry_image_size_width="100"
929  data-display_entry_image_size_height="100"
930  data-display_entry_body_length="0"
931  data-display_entry_date="0"
932  data-display_entry_title_length="20"
933  data-restrict_entry_title_length="0"
934  data-display_bookmark_count="0"
935
936>
937  <div class="hatena-module-title">
938    
939      注目記事
940    
941  </div>
942  <div class="hatena-module-body">
943    
944  </div>
945</div>
946
947    
948      
949
950<div class="hatena-module hatena-module-category">
951  <div class="hatena-module-title">
952    カテゴリー
953  </div>
954  <div class="hatena-module-body">
955    <ul class="hatena-urllist">
956      
957        <li>
958          <a href="https://www.szdrblog.info/archive/category/Python" class="category-Python">
959            Python (19)
960          </a>
961        </li>
962      
963        <li>
964          <a href="https://www.szdrblog.info/archive/category/%E3%81%9D%E3%81%AE%E4%BB%96" class="category-その他">
965            その他 (2)
966          </a>
967        </li>
968      
969        <li>
970          <a href="https://www.szdrblog.info/archive/category/%E6%83%85%E5%A0%B1%E6%A4%9C%E7%B4%A2" class="category-情報検索">
971            情報検索 (5)
972          </a>
973        </li>
974      
975        <li>
976          <a href="https://www.szdrblog.info/archive/category/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92" class="category-機械学習">
977            機械学習 (33)
978          </a>
979        </li>
980      
981        <li>
982          <a href="https://www.szdrblog.info/archive/category/%E8%82%B2%E5%85%90" class="category-育児">
983            育児 (1)
984          </a>
985        </li>
986      
987        <li>
988          <a href="https://www.szdrblog.info/archive/category/%E7%B5%B1%E8%A8%88%E5%AD%A6" class="category-統計学">
989            統計学 (6)
990          </a>
991        </li>
992      
993        <li>
994          <a href="https://www.szdrblog.info/archive/category/Linux" class="category-Linux">
995            Linux (1)
996          </a>
997        </li>
998      
999        <li>
1000          <a href="https://www.szdrblog.info/archive/category/Java" class="category-Java">
1001            Java (1)
1002          </a>
1003        </li>
1004      
1005        <li>
1006          <a href="https://www.szdrblog.info/archive/category/TeX" class="category-TeX">
1007            TeX (1)
1008          </a>
1009        </li>
1010      
1011        <li>
1012          <a href="https://www.szdrblog.info/archive/category/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3" class="category-デザイン">
1013            デザイン (3)
1014          </a>
1015        </li>
1016      
1017        <li>
1018          <a href="https://www.szdrblog.info/archive/category/PowerPoint" class="category-PowerPoint">
1019            PowerPoint (1)
1020          </a>
1021        </li>
1022      
1023    </ul>
1024  </div>
1025</div>
1026
1027    
1028      
1029
1030<div class="hatena-module hatena-module-archive" data-archive-type="default" data-archive-url="https://www.szdrblog.info/archive">
1031  <div class="hatena-module-title">
1032    <a href="https://www.szdrblog.info/archive">月別アーカイブ</a>
1033  </div>
1034  <div class="hatena-module-body">
1035    
1036      
1037        <ul class="hatena-urllist">
1038          
1039            <li class="archive-module-year archive-module-year-hidden" data-year="2023">
1040              <div class="archive-module-button">
1041                <span class="archive-module-hide-button">▼</span>
1042                <span class="archive-module-show-button">▶</span>
1043              </div>
1044              <a href="https://www.szdrblog.info/archive/2023" class="archive-module-year-title archive-module-year-2023">
1045                2023
1046              </a>
1047              <ul class="archive-module-months">
1048                
1049                  <li class="archive-module-month">
1050                    <a href="https://www.szdrblog.info/archive/2023/12" class="archive-module-month-title archive-module-month-2023-12">
1051                      2023 / 12
1052                    </a>
1053                  </li>
1054                
1055                  <li class="archive-module-month">
1056                    <a href="https://www.szdrblog.info/archive/2023/10" class="archive-module-month-title archive-module-month-2023-10">
1057                      2023 / 10
1058                    </a>
1059                  </li>
1060                
1061              </ul>
1062            </li>
1063          
1064            <li class="archive-module-year archive-module-year-hidden" data-year="2022">
1065              <div class="archive-module-button">
1066                <span class="archive-module-hide-button">▼</span>
1067                <span class="archive-module-show-button">▶</span>
1068              </div>
1069              <a href="https://www.szdrblog.info/archive/2022" class="archive-module-year-title archive-module-year-2022">
1070                2022
1071              </a>
1072              <ul class="archive-module-months">
1073                
1074                  <li class="archive-module-month">
1075                    <a href="https://www.szdrblog.info/archive/2022/12" class="archive-module-month-title archive-module-month-2022-12">
1076                      2022 / 12
1077                    </a>
1078                  </li>
1079                
1080              </ul>
1081            </li>
1082          
1083            <li class="archive-module-year archive-module-year-hidden" data-year="2021">
1084              <div class="archive-module-button">
1085                <span class="archive-module-hide-button">▼</span>
1086                <span class="archive-module-show-button">▶</span>
1087              </div>
1088              <a href="https://www.szdrblog.info/archive/2021" class="archive-module-year-title archive-module-year-2021">
1089                2021
1090              </a>
1091              <ul class="archive-module-months">
1092                
1093                  <li class="archive-module-month">
1094                    <a href="https://www.szdrblog.info/archive/2021/12" class="archive-module-month-title archive-module-month-2021-12">
1095                      2021 / 12
1096                    </a>
1097                  </li>
1098                
1099                  <li class="archive-module-month">
1100                    <a href="https://www.szdrblog.info/archive/2021/04" class="archive-module-month-title archive-module-month-2021-4">
1101                      2021 / 4
1102                    </a>
1103                  </li>
1104                
1105                  <li class="archive-module-month">
1106                    <a href="https://www.szdrblog.info/archive/2021/01" class="archive-module-month-title archive-module-month-2021-1">
1107                      2021 / 1
1108                    </a>
1109                  </li>
1110                
1111              </ul>
1112            </li>
1113          
1114            <li class="archive-module-year archive-module-year-hidden" data-year="2020">
1115              <div class="archive-module-button">
1116                <span class="archive-module-hide-button">▼</span>
1117                <span class="archive-module-show-button">▶</span>
1118              </div>
1119              <a href="https://www.szdrblog.info/archive/2020" class="archive-module-year-title archive-module-year-2020">
1120                2020
1121              </a>
1122              <ul class="archive-module-months">
1123                
1124                  <li class="archive-module-month">
1125                    <a href="https://www.szdrblog.info/archive/2020/12" class="archive-module-month-title archive-module-month-2020-12">
1126                      2020 / 12
1127                    </a>
1128                  </li>
1129                
1130                  <li class="archive-module-month">
1131                    <a href="https://www.szdrblog.info/archive/2020/11" class="archive-module-month-title archive-module-month-2020-11">
1132                      2020 / 11
1133                    </a>
1134                  </li>
1135                
1136                  <li class="archive-module-month">
1137                    <a href="https://www.szdrblog.info/archive/2020/08" class="archive-module-month-title archive-module-month-2020-8">
1138                      2020 / 8
1139                    </a>
1140                  </li>
1141                
1142                  <li class="archive-module-month">
1143                    <a href="https://www.szdrblog.info/archive/2020/03" class="archive-module-month-title archive-module-month-2020-3">
1144                      2020 / 3
1145                    </a>
1146                  </li>
1147                
1148              </ul>
1149            </li>
1150          
1151            <li class="archive-module-year archive-module-year-hidden" data-year="2019">
1152              <div class="archive-module-button">
1153                <span class="archive-module-hide-button">▼</span>
1154                <span class="archive-module-show-button">▶</span>
1155              </div>
1156              <a href="https://www.szdrblog.info/archive/2019" class="archive-module-year-title archive-module-year-2019">
1157                2019
1158              </a>
1159              <ul class="archive-module-months">
1160                
1161                  <li class="archive-module-month">
1162                    <a href="https://www.szdrblog.info/archive/2019/12" class="archive-module-month-title archive-module-month-2019-12">
1163                      2019 / 12
1164                    </a>
1165                  </li>
1166                
1167              </ul>
1168            </li>
1169          
1170            <li class="archive-module-year archive-module-year-hidden" data-year="2018">
1171              <div class="archive-module-button">
1172                <span class="archive-module-hide-button">▼</span>
1173                <span class="archive-module-show-button">▶</span>
1174              </div>
1175              <a href="https://www.szdrblog.info/archive/2018" class="archive-module-year-title archive-module-year-2018">
1176                2018
1177              </a>
1178              <ul class="archive-module-months">
1179                
1180                  <li class="archive-module-month">
1181                    <a href="https://www.szdrblog.info/archive/2018/12" class="archive-module-month-title archive-module-month-2018-12">
1182                      2018 / 12
1183                    </a>
1184                  </li>
1185                
1186                  <li class="archive-module-month">
1187                    <a href="https://www.szdrblog.info/archive/2018/11" class="archive-module-month-title archive-module-month-2018-11">
1188                      2018 / 11
1189                    </a>
1190                  </li>
1191                
1192                  <li class="archive-module-month">
1193                    <a href="https://www.szdrblog.info/archive/2018/07" class="archive-module-month-title archive-module-month-2018-7">
1194                      2018 / 7
1195                    </a>
1196                  </li>
1197                
1198                  <li class="archive-module-month">
1199                    <a href="https://www.szdrblog.info/archive/2018/02" class="archive-module-month-title archive-module-month-2018-2">
1200                      2018 / 2
1201                    </a>
1202                  </li>
1203                
1204              </ul>
1205            </li>
1206          
1207            <li class="archive-module-year archive-module-year-hidden" data-year="2017">
1208              <div class="archive-module-button">
1209                <span class="archive-module-hide-button">▼</span>
1210                <span class="archive-module-show-button">▶</span>
1211              </div>
1212              <a href="https://www.szdrblog.info/archive/2017" class="archive-module-year-title archive-module-year-2017">
1213                2017
1214              </a>
1215              <ul class="archive-module-months">
1216                
1217                  <li class="archive-module-month">
1218                    <a href="https://www.szdrblog.info/archive/2017/12" class="archive-module-month-title archive-module-month-2017-12">
1219                      2017 / 12
1220                    </a>
1221                  </li>
1222                
1223                  <li class="archive-module-month">
1224                    <a href="https://www.szdrblog.info/archive/2017/11" class="archive-module-month-title archive-module-month-2017-11">
1225                      2017 / 11
1226                    </a>
1227                  </li>
1228                
1229                  <li class="archive-module-month">
1230                    <a href="https://www.szdrblog.info/archive/2017/05" class="archive-module-month-title archive-module-month-2017-5">
1231                      2017 / 5
1232                    </a>
1233                  </li>
1234                
1235                  <li class="archive-module-month">
1236                    <a href="https://www.szdrblog.info/archive/2017/03" class="archive-module-month-title archive-module-month-2017-3">
1237                      2017 / 3
1238                    </a>
1239                  </li>
1240                
1241                  <li class="archive-module-month">
1242                    <a href="https://www.szdrblog.info/archive/2017/02" class="archive-module-month-title archive-module-month-2017-2">
1243                      2017 / 2
1244                    </a>
1245                  </li>
1246                
1247                  <li class="archive-module-month">
1248                    <a href="https://www.szdrblog.info/archive/2017/01" class="archive-module-month-title archive-module-month-2017-1">
1249                      2017 / 1
1250                    </a>
1251                  </li>
1252                
1253              </ul>
1254            </li>
1255          
1256            <li class="archive-module-year archive-module-year-hidden" data-year="2016">
1257              <div class="archive-module-button">
1258                <span class="archive-module-hide-button">▼</span>
1259                <span class="archive-module-show-button">▶</span>
1260              </div>
1261              <a href="https://www.szdrblog.info/archive/2016" class="archive-module-year-title archive-module-year-2016">
1262                2016
1263              </a>
1264              <ul class="archive-module-months">
1265                
1266                  <li class="archive-module-month">
1267                    <a href="https://www.szdrblog.info/archive/2016/12" class="archive-module-month-title archive-module-month-2016-12">
1268                      2016 / 12
1269                    </a>
1270                  </li>
1271                
1272                  <li class="archive-module-month">
1273                    <a href="https://www.szdrblog.info/archive/2016/11" class="archive-module-month-title archive-module-month-2016-11">
1274                      2016 / 11
1275                    </a>
1276                  </li>
1277                
1278                  <li class="archive-module-month">
1279                    <a href="https://www.szdrblog.info/archive/2016/10" class="archive-module-month-title archive-module-month-2016-10">
1280                      2016 / 10
1281                    </a>
1282                  </li>
1283                
1284                  <li class="archive-module-month">
1285                    <a href="https://www.szdrblog.info/archive/2016/09" class="archive-module-month-title archive-module-month-2016-9">
1286                      2016 / 9
1287                    </a>
1288                  </li>
1289                
1290                  <li class="archive-module-month">
1291                    <a href="https://www.szdrblog.info/archive/2016/08" class="archive-module-month-title archive-module-month-2016-8">
1292                      2016 / 8
1293                    </a>
1294                  </li>
1295                
1296                  <li class="archive-module-month">
1297                    <a href="https://www.szdrblog.info/archive/2016/07" class="archive-module-month-title archive-module-month-2016-7">
1298                      2016 / 7
1299                    </a>
1300                  </li>
1301                
1302                  <li class="archive-module-month">
1303                    <a href="https://www.szdrblog.info/archive/2016/06" class="archive-module-month-title archive-module-month-2016-6">
1304                      2016 / 6
1305                    </a>
1306                  </li>
1307                
1308              </ul>
1309            </li>
1310          
1311        </ul>
1312      
1313    
1314  </div>
1315</div>
1316
1317    
1318  </div>
1319</aside>
1320
1321
1322  </div>
1323</div>
1324
1325
1326
1327
1328      
1329
1330      
1331
1332
1333    </div>
1334  </div>
1335  
1336<footer id="footer" data-brand="hatenablog">
1337  <div id="footer-inner">
1338    
1339      <div style="display:none !important" class="guest-footer js-guide-register test-blogs-register-guide" data-action="guide
1339-register">
1340  <div class="guest-footer-content">
1341    <h3>はてなブログをはじめよう!</h3>
1342    <p>sz_drさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?</p>
1343    <div class="guest-footer-btn-container">
1344      <div  class="guest-footer-btn">
1345        <a class="btn btn-register js-inherit-ga" href="https://blog.hatena.ne.jp/register?via=200227" target="_blank">はてなブログをはじめる(無料)</a>
1346      </div>
1347      <div  class="guest-footer-btn js-hide-on-smartphone-app">
1348        <a href="https://hatena.blog/guide" target="_blank">はてなブログとは</a>
1349      </div>
1350    </div>
1351  </div>
1352</div>
1353
1354    
1355    <address class="footer-address">
1356      <a href="https://www.szdrblog.info/">
1357        <img src="https://cdn.image.st-hatena.com/image/square/2add95f3d3869dbec2cf4c52d706c470c1a3367b/backend=imagemagick;height=128;version=1;width=128/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fcustom_blog_icon%2F107076361%2F1514243901786506" width="16" height="16" alt="人間だったら考えて"/>
1358        <span class="footer-address-name">人間だったら考えて</span>
1359      </a>
1360    </address>
1361    <p class="services">
1362      Powered by <a href="https://hatena.blog/">Hatena Blog</a>
1363      |
1364        <a href="https://blog.hatena.ne.jp/-/abuse_report?target_url=https%3A%2F%2Fwww.szdrblog.info%2Fentry%2F2023%2F12%2F22%2F233113" class="report-abuse-link test-report-abuse-link" target="_blank">ブログを報告する</a>
1365    </p>
1366  </div>
1367</footer>
1368
1369
1370  
1371  
1371<script async src="https://s.hatena.ne.jp/js/widget/star.js"></script>
1371
1372  
1373  
1374  
1374<script>
1375    if (typeof window.Hatena === 'undefined') {
1376      window.Hatena = {};
1377    }
1378    if (!Hatena.hasOwnProperty('Star')) {
1379      Hatena.Star = {
1380        VERSION: 2,
1381      };
1382    }
1383  </script>
1383
1384
1385
1386  
1387  
1388
1389<div class="quote-box">
1390  <div class="tooltip-quote tooltip-quote-stock">
1391    <i class="blogicon-quote" title="引用をストック"></i>
1392  </div>
1393  <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet">
1394    <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once>
1395      <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=6810a7f5d0766c84edfe3b435c3a2e" title="引用して投稿する" >
1396    </a>
1397  </div>
1398</div>
1399
1400<div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000">
1401  <div class="message-box" id="quote-stock-succeeded-message" style="display: none">
1402    <p>引用をストックしました</p>
1403    <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button>
1404    <button class="btn quote-stock-close-message-button">閉じる</button>
1405  </div>
1406
1407  <div class="message-box" id="quote-login-required-message" style="display: none">
1408    <p>引用するにはまずログインしてください</p>
1409    <button class="btn btn-primary" id="quote-login-button">ログイン</button>
1410    <button class="btn quote-stock-close-message-button">閉じる</button>
1411  </div>
1412
1413  <div class="error-box" id="quote-stock-failed-message" style="display: none">
1414    <p>引用をストックできませんでした。再度お試しください</p>
1415    <button class="btn quote-stock-close-message-button">閉じる</button>
1416  </div>
1417
1418  <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;">
1419    <p>限定公開記事のため引用できません。</p>
1420  </div>
1421</div>
1422
1423<script type="x-underscore-template" id="js-requote-button-template">
1424  <div class="requote-button js-requote-button">
1425    <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button>
1426  </div>
1427</script>
1427
1428
1429
1430
1431  
1432  <div id="hidden-subscribe-button" style="display: none;">
1433    <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box"
1434  
1435  >
1436
1437  <a href="#" class="hatena-follow-button js-hatena-follow-button">
1438    <span class="subscribing">
1439      <span class="foreground">読者です</span>
1440      <span class="background">読者をやめる</span>
1441    </span>
1442    <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once>
1443      <span class="foreground">読者になる</span>
1444      <span class="background">読者になる</span>
1445    </span>
1446  </a>
1447  <div class="subscription-count-box js-subscription-count-box">
1448    <i></i>
1449    <u></u>
1450    <span class="subscription-count js-subscription-count">
1451    </span>
1452  </div>
1453</div>
1454
1455  </div>
1456
1457  
1458
1459
1460
1461    
1462
1463
1464  
1464<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
1464
1465
1466<script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script>
1466
1467
1468
1469<script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&amp;version=6810a7f5d0766c84edfe3b435c3a2e"></script>
1469
1470
1471
1472
1473
1474
1475
1476
1477<script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=6810a7f5d0766c84edfe3b435c3a2e"></script>
1477
1478
1479
1480
1481  
1481<script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=6810a7f5d0766c84edfe3b435c3a2e" crossorigin="anonymous"></script>
1481
1482
1483<script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=6810a7f5d0766c84edfe3b435c3a2e" crossorigin="anonymous" data-page-id="entry"></script>
1483
1484
1485
1486  
1486<script>Hatena.Diary.GlobalHeader.init()</script>
1486
1487
1488
1489
1490
1491
1492
1493
1494    
1495
1496    
1497
1498
1499
1500
1501
1502  </body>
1503</html>
1504

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.